Electron-builder之自定义NSIS脚本问题记录

3,616 阅读2分钟

小时候,哭是我们解决问题的绝招;长大后,笑是我们面对现实的武器

说明

作为一个前端开发人员,要来写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

说明:不要错误的认为这里的6432指将要安装程序的操作系统的位数,它实际指打包出来的程序位数。

例:打包出来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路径下

image.png 如上图,每个文件夹下放着对应操作系统的dll插件

进入C:\Users\rabbit\AppData\Local\electron-builder\Cache\nsis\nsis-3.0.4.1\Plugins路径下

image.pngdll插件放入对应的文件夹下。

注意:上述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安装程序的脚本即可。

结尾

今后还会补充!!!