话不多说,先来简介背景:
一、背景
为了方便表述,需要开发的应用叫A应用,依赖的应用叫B
- 公司要快速开发一个window上的应用A,打包成exe,然而我只是一个会写react的前端;
- A应用依赖了另一个应用B,要在这个A应用里集成B,在安装的时候让用户可以选择是否安装B;效果类似与下图:
二、开始解题
- 用js构建桌面应用,首选Electron框架,项目模板用的 electron-vite-react 生成,开发体验都很不错,没有遇到十分棘手的问题。
- 项目中的最终打包成exe是electron-builder,因为需要有个类似于自定义安装界面的需要,我比较关注的就是在windows上的nsis怎么配置,对应的就是electron-builder官网上对这部分的说明。
三、自定义打包界面
- 从electron-builder官网上来看是支持自定义nsis脚本的
- 项目模板中对于nsis的相关配置是放在这里的:
- 我们对nsis配置部分按照官网说明加以修改
nsis:
artifactName: ${name}-${version}-setup.${ext}
shortcutName: ${productName}
uninstallDisplayName: ${productName}
createDesktopShortcut: always
oneClick: true
# 这里添加一行自定义安装脚本
include: './build/installer.nsh'
- 接下来就是nsis脚本编写了,附上nsis的官方使用说明
RequestExecutionLevel admin
# 定义可选组件页
Page components componentB
Section "component1 Install" SEC01
DetailPrint "Starting copy componentB..."
# 勾选上组件提示需要使用的磁盘容量
AddSize 1015107
DetailPrint "ending copy componentB."
SectionEnd
Function component1
DetailPrint "Starting Function componentB..."
FunctionEnd
!macro customInstall
# 设置下边的语句输出到$INSTDIR(安装目录,用户选择安装的位置)
SetOutPath $INSTDIR\resource
# 将$BUILD_RESOURCES_DIR(构建目录,打包时候的目录)下的resource\componentB.exe文件复制到上面指定的位置
File "${BUILD_RESOURCES_DIR}\resource\componentB.exe"
# 获取用户是否勾选了componentB,将值写进$0寄存器中
SectionGetFlags ${SEC01} $0
# 这里还可以执行bash
ExecWait '"$INSTDIR\resource\installed.bat" $0'
!macroend
- 脚本里用到的几个变量$INSTDIR、$BUILD_RESOURCES_DIR、$INSTDIR参考这里,在写nsis脚本时,如果需要往某个目录中写文件,需要注意一下权限。
- 添加卸载步骤。
备注:看了官网的nsis脚本怎么写,感觉还是有点复杂,推荐一个nsis脚本自动生成工具:HM NIS Edit,这个工具使用前提需要安装NSIS