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、条件判断,循环等用法
条件判断或执行代码循环可以使用 StrCmp, IntCmp, IfErrors, Goto和其它来实现,
或使用 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的(脚本结构)