electron自定义安装配置文件nsh

534 阅读1分钟

Electron 打包工具Electron-build,Electron-build使用了nsis组件来创建安装向导,默认情况nsis安装向导不能自定义安装向导界面,但是nsis提供了nsis脚本可以扩展安装向导。

nsh提供了所需配置的宏:如customHeader,preInit,customInit,customUnInit,customInstall,customUnInstall,customRemoveFiles,customInstallMode,customWelcomePage,customUnWelcomePage。

一、创建nsh文件

!macro customHeader
  !system "echo '' > ${BUILD_RESOURCES_DIR}/customHeader"
!macroend

!macro preInit
  ; This macro is inserted at the beginning of the NSIS .OnInit callback
  !system "echo '' > ${BUILD_RESOURCES_DIR}/preInit"
!macroend

!macro customInit
  !system "echo '' > ${BUILD_RESOURCES_DIR}/customInit"
!macroend

!macro customInstall
  !system "echo '' > ${BUILD_RESOURCES_DIR}/customInstall"
!macroend

!macro customInstallMode
  # set $isForceMachineInstall or $isForceCurrentInstall
  # to enforce one or the other modes.
!macroend

!macro customWelcomePage
  # Welcome Page is not added by default for installer.
  !insertMacro MUI_PAGE_WELCOME
!macroend

!macro customUnWelcomePage
  !define MUI_WELCOMEPAGE_TITLE "custom title for uninstaller welcome page"
  !define MUI_WELCOMEPAGE_TEXT "custom text for uninstaller welcome page $\r$\n more"
  !insertmacro MUI_UNPAGE_WELCOME
!macroend

在package.json添加nsis脚本:"include": "build/installer.nsh"

"nsis": {
      "include": "build/installer.nsh"
 }

二、nsh语法

2.1常用语法:

注释用 "#"";"
数字常量用十进制,十六进制,八进制表示
字符常量可以用引号,特殊字符用"$"转义
变量用 Var 定义 变量引用方式${NAME}或 $NAME,如:Var name
常量用 !default 定义,如: !default NAME "xxx"
内置变量:$0~$9和$R0~$R9,不用声明即可使用,通常用于参数传递
变量赋值使用StrCpy,如: StrCpy $0 "hello"
内置堆栈,使用push和pop来入栈和出栈,用于暂存数据

2.2、页面

Page license                  #许可协议页面
Page components               #允许选择要安装的组件
Page directory                #允许选择要安装的目录
Page instfiles                #安装过程页面
UninstPage uninstConfirm      #卸载确认页面
UninstPage instfiles          #卸载过程页面

2.3、区域

Section "Installer Section"
SectionEnd

Section "un.Uninstaller Section"
SectionEnd

2.4宏

!macro 宏名 [参数1] [参数n]
!macroend

2.5、函数

函数名以"."开头的,一般为回调函数,以"un."开头的为卸载函数
函数不能传递参数,可以从全局变量中取,或使用内置变量
Function 函数名
FunctionEnd

2.6、条件判断,循环等用法

条件判断或执行代码循环可以使用 StrCmpIntCmpIfErrorsGoto和其它来实现,
或使用 LogicLib 的话代码将更具有可读性并更容易理解,当然也更容易维护,
要使用 LogicLib, 必须在脚本的顶部或是需要使用该命令的前一行包含如下头文件:

!include LogicLib.nsh

使用示例:
${If} $0 == 'some value'
  MessageBox MB_OK '$$0 is some value'
${ElseIf} $0 == 'some other value'
  MessageBox MB_OK '$$0 is some other value'
${Else}
  MessageBox MB_OK '$$0 is "$0"'
${EndIf}

${Switch} $0
  ${Case} 'some value'
    MessageBox MB_OK '$$0 is some value'
    ${Break}
  ${Case} 'some other value'
    MessageBox MB_OK '$$0 is some other value'
    ${Break}
  ${Default}
    MessageBox MB_OK '$$0 is "$0"'
    ${Break}
${EndSwitch}

StrCpy $R1 0
${While} $R1 < 5
  IntOp $R1 $R1 + 1
  DetailPrint $R1
${EndWhile}

${For} $R1 1 5
  DetailPrint $R1
${Next}

2.7、指令

# 消息弹窗
MessageBox 消息框选项列表 消息框文本 [/SD 返回] [检测返回值 跳转到] [检测返回值2 跳转到2]
# 示例
MessageBox MB_OK "安装路径为:$INSTDIR" IDOK

三、常用的配置

3.1、常用变量

$INSTDIR 安装目录
$OUTFIR  输出目录
$CMDLINE 安装程序命令行,如:$CMDLINE "安装程序.exe" 参数1 参数2
$LANGUAGE  语音标识
$PROGRAMFILES,$PROGRAMFILES32,$PROGRAMFILES64 程序文件目录(c:/Program Files)
$COMMONFILES,$COMMONFILES32,$COMMONFILES64 公共文件目录(c:/Program Files/common files)
$DESKTOP  桌面目录
$EXEDIR 可执行文件运行所在目录  $EXEFILE 可执行文件运行名字 $EXEPATH 可执行文件完整路径
$WINDIR  windows目录 (c:/windows)
$SYSDIR windows目录 (c:/windows/system)
$TEMP  系统临时目录 (C:/Windows/Temp)
$STARTMENU  开始菜单目录
$APPDATA  应用程序数据目录
$DOCUMENTS  文档目录
$LOCALAPPDATA 本机应用程序数据目录
${APP_NAME} 应用名
${APP_EXECUTABLE} 应用程序的可执行文件名称

3.2、自定义安装路径

!macro preInit
    SetRegView 64
    WriteRegExpandStr HKLM "${INSTALL_REGISTRY_KEY}" InstallLocation "D:\要安装的路径"
    WriteRegExpandStr HkCU "${INSTALL_REGISTRY_KEY}" InstallLocation "D:\要安装的路径"
    SetRegView 32
    WriteRegExpandStr HKLM "${INSTALL_REGISTRY_KEY}" InstallLocation "D:\要安装的路径"
    WriteRegExpandStr HkCU "${INSTALL_REGISTRY_KEY}" InstallLocation "D:\要安装的路径"
!macroend

3.3、写入注册表和删除写入

 Var /GLOBAL ChromeExtensionId
 StrCpy $ChromeExtensionId "谷歌插件id"
 
!macro customInstall
    WriteRegStr HKLM "SOFTWARE\Policies\Google\Chrome\ExtensionInstallWhitelist" "1" "$ChromeExtensionId"
    WriteRegStr HKLM "SOFTWARE\Policies\Google\Chrome\ExtensionInstallAllowlist" "1" "$ChromeExtensionId"
    WriteRegStr HKCU "SOFTWARE\Google\Chrome\NativeMessagingHosts\应用名" "" "$INSTDIR\${APP_NAME}"
    WriteRegStr HKCU "SOFTWARE\Google\Chrome\Extensions\$ChromeExtensionId" "path" "$INSTDIR\resources\插件名.crx"
    WriteRegStr HKCU "SOFTWARE\Google\Chrome\Extensions\$ChromeExtensionId" "version" "1.0"
!macroend

!macro customUninstall
    DeleteRegValue HKLM "SOFTWARE\Policies\Google\Chrome\ExtensionInstallWhitelist" "1"
    DeleteRegValue HKLM "SOFTWARE\Policies\Google\Chrome\ExtensionInstallAllowlist" "1"
    DeleteRegKey HKCU "SOFTWARE\Google\Chrome\NativeMessagingHosts\${APP_NAME}" 
    DeleteRegKey HKCU "SOFTWARE\Google\Chrome\Extensions\$ChromeExtensionId" 
!macroend

常用注册表路径:
//开机自启动
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "${APP_NAME}" "$INSTDIR\${APP_NAME}.exe"

//添加注册表项到右键菜单 
WriteRegStr HKCR "*\shell\${APP_NAME}" "" "通过 ${APP_NAME} 打开" 
WriteRegStr HKCR "*\shell\${APP_NAME}\command" "" '"$INSTDIR\${APP_EXECUTABLE}" "%1"' ; 
//设置右键菜单图标 
WriteRegStr HKCR "*\shell\${APP_NAME}\Icon" "" "$INSTDIR\${APP_EXECUTABLE},0"

3.4、创建文件夹,写入文件等

Function writeFile
    SetOutPath "$APPDATA\demo"
    CreateDirectory "$APPDATA\demo"
    StrCpy $0 '{"user":"$0","password":"$1",}'
    FileOpen $1 "$APPDATA\demo\config.json" "w"
    FileWrite $1 $0
    FileClose $1
FunctionEnd

四、总结

nsis可以用于美化安装向导,提供安装时的额外操作,功能非常强大,详细语法可以参看nis的(脚本结构)