Electron自定义软件卸载流程
@此文章为问题解决方案记录@我碰到一个问题,我的单机程序集成了一个本地数据库,存放本地数据库文件的文件夹存放在用户的也就 这个文件夹中。😂😂所以,问题就来了,我发现,我卸载了这个程序,重新安装之后,程序竟然还能读取到我之前存储的数据,有点不符合逻辑。可是,我在的配置中已经配置了:注:我这里说的指的是的打包配置,不同框架之间配置的地方不同,比如: 和 的配置地方就不一样。所以,为什么呢?我去看了
Electron自定义软件卸载流程
@此文章为问题解决方案记录@
前言:
- 我并不会
nsis
,应该小白都算不上。- 所以接下来我说的,就是很简单的东西。
问题描述
我碰到一个问题,我的Electron
单机程序集成了一个本地数据库,存放本地数据库文件的文件夹database
存放在用户的Documents
也就文档
这个文件夹中。😂😂
- 应该不难理解,就是用户的
Documents
文件夹里有个database
文件夹,database
文件夹存放的是数据库文件
所以,问题就来了,我发现,我卸载了这个程序,重新安装之后,程序竟然还能读取到我之前存储的数据,有点不符合逻辑。
- 一般情况下,卸载软件要卸载干净,重新安装软件那就是一个全新的程序。
- 除非用户自己手动选择我要不要留存我的配置文件,以供下次使用。
可是,我在electron-build
的配置中已经配置了:
{
"deleteAppDataOnUninstall": true
}
注:我这里说的electron-build
指的是electron
的打包配置,不同框架之间配置的地方不同,比如:vue-electron
和 angular-electron
的配置地方就不一样。
所以,为什么呢?
我去看了一下人家electron-build官网的解释,并结合卸载流程来看,原来electron
本身卸载时只管删除程序安装数据文件夹,以及自己创建的程序数据文件夹。
- 当然,如果你把的东西也放到人家创建的程序数据文件夹中,那也会跟着卸载一起删除。
- But,I‘m not. 悲伤辣么大。
有兴趣的朋友,可以去看看人家electron
的卸载流程nsis
文件electron-uninstaller.nsh
但是呢,我把数据库存放到其他地方也自有其好处,所以,我的探寻重点就是:
- 如何让用户手动选择是否要删除数据库文件,而我根据用户的选择自动的去进行删除
- 而不是,把数据库挪挪地方。
由此,就牵扯出了 一个问题:我如何去自定义软件的卸载流程。
再简单点,我如何在卸载流程上动动手脚,加个复选框,让用户选择,而我根据选择结果做操作。
所以,NSIS
必须的。
自定义卸载流程
我到时会把我弄的nsis
脚本放到最后,供大家参考。
我从网上查阅了很多资料,比较令我有头绪的就是这个:electron-builder添加自定义安装卸载界面
- 我说句公道话,我从网上一搜,全是这个博客内容,基本都不带改的。🤐🤐🤐 我也不确定这是不是原版,据说原版实在新浪博客发布的,但是新浪博客。。。。
不过呢,这个博客确确实实有东西,最起码,你搬过去改一下文字,就能在卸载时看到效果。而我所做的,也只是在此基础上改一些问题。
首先,博客中的NSIS
脚本规定的流程没问题,但是脚本写的有点不符合习惯。可能也跟作者想告诉我们该如何操作有关,所以这个脚本直接拿来用的话,你会发现软件的卸载流程会变成这样:
- 卸载软件,卸载弹窗打开。
- 展示脚本写好的页面,用户选择是否删除本地用户数据
- 执行卸载流程
- 流程即将执行完毕时—弹窗—提示用户是否确认删除本地用户数据
- 执行弹窗操作,卸载完成
- 流程结束
有点繁琐,应该在第二步时,就记录用户的选择结果,然后执行卸载流程,根据选择结果,自动删除/不删除本地用户数据。
所以,要对NSIS
脚本进行改造:
!include nsDialogs.nsh
XPStyle on
# 此卸载脚本在原有基础上添加指定义卸载页面 用于显示提示用户删除用户数据
Var /GLOBAL Dialog_1
; Var /GLOBAL HLine
Var /GLOBAL VLine
; Var /GLOBAL Text_1
Var /GLOBAL Label_1
Var /GLOBAL Label_2
Var /GLOBAL CheckBox_1
Var /GLOBAL Checkbox_State
# 创建自定义卸载页面
UninstPage custom un.nsDialogsPage un.nsDialogsPageLeave
Function un.nsDialogsPage
nsDialogs::Create 1018
Pop $Dialog_1
${If} $Dialog_1 == error
Abort
${EndIf}
${NSD_CreateVLine} 0 30u 100% 12u ""
Pop $VLine
${NSD_CreateLabel} 0 10u 100% 12u "卸载提示:是否删除本地存储数据?"
Pop $Label_1
${NSD_CreateLabel} 10u 30u 100% 12u "保留本地存储数据可在重新安装后找回以往存储数据"
Pop $Label_2
${NSD_CreateCheckbox} 0 50u 100% 10u "&确认删除本地存储数据"
Pop $CheckBox_1
nsDialogs::Show
FunctionEnd
Function un.nsDialogsPageLeave
${NSD_GetState} $CheckBox_1 $Checkbox_State
FunctionEnd
Section
SectionEnd
!macro customUnInstall
; 卸载过程执行
${ifNot} ${isUpdated}
# 判断选择结果
${If} $Checkbox_State == 1
SetShellVarContext current
;MessageBox MB_OK "You checked:$\n$\n CheckBox_1 $CheckBox_1 $\n$\n Checkbox_State $Checkbox_State $\n$\n BST_CHECKED $DOCUMENTS $\n$\n BST_UNCHECKED ${BST_UNCHECKED}" #MessageBox用于调试
# delete Documents database directory
RMDir /r "$DOCUMENTS\database"
${EndIf}
${endIf}
!macroend
脚本重点在 宏*(注:每一个macro
都是一个宏)*中,这里预定义了一个 卸载过程中执行的宏 customUnInstall
,删除掉之前的提示窗,改为上面我写操作。
- 根据用户对复选框
$CheckBox_1
的操作结果$CheckBox_State
判断,选中:1,非选中:0 - 决定是否删除数据库,这样就不会在最后还有个弹窗确认,符合操作流程。
一些小问题:
如何获取一些文件的路径呢?
NSIS
为我们提供了一些定义好的属性信息:Constats, 这都是一些安装目录,我们可以在这里简单的找找。
如何判断路径是否正确呢?
- 我们可以在脚本中放开
MessageBox
那一行,删除前面的;
就是执行这一行。MessageBox
会在卸载时弹出一个提示框,我们可以在这里实验我们拿到的路径是否正确。
一个重要的东西:
SetShellVarContext current
这个很重要,以$DOCUMENTS
属性举例
- 因为我们在安装时有可能选择的时为所有用户安装,所以获取的文档路径变成了
C:\user\public\document
,这可能就不对了,因为我的文件时存放在用户目录下的即:C:\user\xxxx\dcoument
- 所以,
SetShellVarContext current
可以指定用户Shell文件夹的上下文 ,让其获取当前用户下的文件夹路径。
OK,说完了,说了一大段,其实还是为了我日后看时能明白,至于各位,如果你跟我一样,也就抄吧,有时间在研究研究,好好搞搞。
更多推荐
所有评论(0)