小时候,哭是我们解决问题的绝招;长大后,笑是我们面对现实的武器
说明
作为一个前端开发人员,要来写NSIS打包脚本,再加上互联网上的相关资料少之又少,属实有些难了。好在功夫不负有心人,解决过的问题在这里作个分享记录,希望能够在大家需要的时候给到帮助。
注:下面默认指windows环境下的打包。
正文
1. 指定默认安装目录
!macro preInit
# 指定安装目录
SetRegView 64
WriteRegExpandStr HKLM "${INSTALL_REGISTRY_KEY}" InstallLocation "C:\Program Files\Rabbit"
WriteRegExpandStr HKCU "${INSTALL_REGISTRY_KEY}" InstallLocation "C:\Program Files\Rabbit"
SetRegView 32
WriteRegExpandStr HKLM "${INSTALL_REGISTRY_KEY}" InstallLocation "C:\Program Files (x86)\Rabbit"
WriteRegExpandStr HKCU "${INSTALL_REGISTRY_KEY}" InstallLocation "C:\Program Files (x86)\Rabbit"
!macroend
说明:不要错误的认为这里的64、32指将要安装程序的操作系统的位数,它实际指打包出来的程序位数。
例:打包出来64位的rabbit.exe安装程序,不论操作系统的位数,都会默认安装到C:\Program Files\Rabbit目录下。
2. 判断 Windows 操作系统的位数
点击这里下载x64.nsh脚本
!include x64.nsh
!macro customInstall
## 64位操作系统
${If} ${RunningX64}
# TODO
## 32位操作系统
${Else}
# TODO
${EndIf}
!macroend
3. 判断 Windows 操作系统的版本
点击这里下载WinVer.nsh脚本
!include WinVer.nsh
!macro customInstall
## 系统为win10系统或更高
${If} ${AtLeastWin10}
# TODO
${EndIf}
!macroend
说明:
AtLeastWin<version>检测是否高于指定版本
IsWin<version>检测指定版本(唯一限定版本)
AtMostWin<version>检测是否低于指定版本
<version>允许的值:
95、98、ME、NT4、2000、XP、2003、Vista、2008、7、2008R2、8、2012、8.1、2012R2、10、11
4. 关闭/开启 Win64 位系统文件重定向
点击这里下载x64.nsh脚本
!include x64.nsh
!macro customInstall
# 关闭64位系统文件重定向
${DisableX64FSRedirection}
# TODO
# 开启64位系统文件的重定向
${EnableX64FSRedirection}
# TODO
!macroend
说明:关于文件重定向的解释,查看这里
5. 生成 JSON 文件
生成JSON文件,需要使用NsJSON插件。
点击这里下载NsJSON.zip压缩包,解压后进入到NsJSON\Plugins路径下
如上图,每个文件夹下放着对应操作系统的
dll插件
进入C:\Users\rabbit\AppData\Local\electron-builder\Cache\nsis\nsis-3.0.4.1\Plugins路径下
将
dll插件放入对应的文件夹下。
注意:上述rabbit路径是我的用户名,nsis-3.0.4.1路径是我的nsis版本,请根据自身实际情况做变更。
!macro customInit
# 写入clientconfig.json文件
nsJSON::Set /value `{}`
nsJSON::Set `name` /value `"rabbit"`
nsJSON::Set `man` /value `true`
nsJSON::Serialize /format /file "C:\Users\Public\Rabbit\clientconfig.json"
!macroend
6. 检测重复安装
首先确认nsis配置项中一定配置了guid字段,如下:
nsis: {
guid: 'Rabbit',
oneClick: true,
perMachine: true,
allowElevation: true,
installerIcon: 'public/favicon.ico',
uninstallerIcon: 'public/favicon.ico',
installerHeaderIcon: 'public/favicon.ico',
createDesktopShortcut: true,
createStartMenuShortcut: true,
shortcutName: 'Rabbit',
deleteAppDataOnUninstall: true,
include: './build/installer.nsh',
runAfterFinish: true
}
配置了guid字段后,程序安装后会在注册表HKEY_LOCAL_MACHINE\SOFTWARE下面生成Rabbit表项,否则是一串类似hash的表项,且每次安装都不同
!macro customInit
# 检测重复安装
ReadRegStr $0 HKLM "SOFTWARE\Rabbit" "ShortcutName"
${If} $0 != ''
MessageBox MB_OK|MB_ICONSTOP "Rabbit已安装在计算机中。如需重新安装,请卸载已有的安装。"
Quit
${EndIf}
!macroend
7. 确认弹窗
以卸载完成重启为例:
!macro customUnInstall
# 卸载完成是否重启
MessageBox MB_YESNO '您必须重新启动系统才能使对 Rabbit 做出的配置修改生效。单击"是"立即重新启动,单击"否"在以后以手动方式重新启动。' IDYES label_yes IDNO label_no
label_yes:
Reboot
Goto end
label_no:
Goto end
end:
!macroend
8. 注册服务
注册服务,需要使用SimpleSC插件。
注:不能将Electron程序自身注册为服务,因为不满足服务程序的条件。这里指在安装时注册第三方程序为服务。
首先需要同[5. 生成 JSON 文件]处相同,将dll插件放入对应的文件夹下。这里给到两个SimpleSC插件的下载地址:
Unicode版本、ANSI版本。
!macro customInstall
# 安装并启动 RabbitService 服务
SimpleSC::InstallService "RabbitService" "RabbitService" "16" "2" '"C:\Program Files\RabbitService.exe"' "" "" ""
SimpleSC::StartService "RabbitService" "" 30
!macroend
!macro customUnInstall
# 卸载 RabbitService 服务
SimpleSC::StopService "RabbitService" 1 30
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
IntCmp $0 0 Done +1 +1
Push $0
SimpleSC::GetErrorMessage
Pop $0
MessageBox MB_OK|MB_ICONSTOP "Stopping Service fails - Reason: $0"
Done:
SimpleSC::RemoveService "RabbitService"
!macroend
9. 安装过程中执行其他应用程序或命令
!macro customInstall
ExecWait '"$INSTDIR\resource\driver\install.bat" /S'
!macroend
带参数
!macro customInstall
ExecWait '"$INSTDIR\resource\driver\install.bat" param /S'
!macroend
若这里需执行的是一个exe可执行程序且需传递参数,你大概率是像下面这样写的:
!macro customInstall
ExecWait '"$INSTDIR\resource\driver\setup.exe" param /S'
!macroend
我尝试这样得到了错误的结果,所以这里给到一种解决方案。很简单,就是也以bat文件的形式去执行,在exe文件同级目录创建一个install.bat文件,插入如下代码:
%~d0
cd %~dp0
start /b setup.exe param
最后修改你的nsh安装程序的脚本即可。
结尾
今后还会补充!!!