Electron Builder NSIS安装程序:创建开机启动快捷方式及后置代码位置
解决Electron Builder NSIS安装包的两个问题
嘿,刚好我之前做过类似的配置,给你一步步说明怎么实现:
1. 在开机启动菜单创建快捷方式
要给Windows开机启动目录添加快捷方式,通过Electron Builder的自定义NSIS脚本就能轻松搞定:
步骤1:配置package.json
在项目的package.json的build字段里,给NSIS指定自定义脚本路径:
{ "build": { "win": { "target": "nsis" }, "nsis": { "include": "./scripts/installer.nsh", // 指向你的自定义NSIS脚本 "createDesktopShortcut": true, "createStartMenuShortcut": true, "shortcutName": "你的应用名称" } } }
步骤2:编写自定义NSIS脚本
在项目根目录创建scripts/installer.nsh文件,添加以下代码:
; 安装成功后执行的逻辑 - 添加开机启动快捷方式 Function .onInstSuccess ; 获取Windows开机启动目录的路径 StrCpy $startupDir "$APPDATA\Microsoft\Windows\Start Menu\Programs\Startup" ; 创建快捷方式到启动目录,这里用Electron Builder预定义的变量,不用硬编码路径 CreateShortcut "$startupDir\${APP_NAME}.lnk" "$INSTDIR\${APP_EXECUTABLE}" "" "$INSTDIR\${APP_ICON}" 0 FunctionEnd ; 卸载时删除开机启动快捷方式,避免残留 Function .onUninstSuccess StrCpy $startupDir "$APPDATA\Microsoft\Windows\Start Menu\Programs\Startup" Delete "$startupDir\${APP_NAME}.lnk" FunctionEnd
这里的${APP_NAME}、${APP_EXECUTABLE}、${APP_ICON}都是Electron Builder自动注入的变量,对应你的应用名称、主程序路径和图标路径,不用自己手动写死路径。
2. 安装完成后执行代码的位置
安装完成后的代码执行分两种场景,看你需要哪种:
场景1:NSIS安装器层面执行代码
直接在上面的.onInstSuccess函数里写逻辑就行,比如执行批处理、调用外部工具,或者做一些系统配置:
Function .onInstSuccess ; 示例:执行安装目录下的post-install.bat脚本 ExecWait '"$INSTDIR\post-install.bat"' ; 或者直接执行命令行指令 ExecWait "echo 安装完成! >> $INSTDIR\install-log.txt" FunctionEnd
场景2:启动你的Electron应用并执行特定逻辑
如果是想在安装完成后启动应用,并且让应用执行初始化操作,你可以:
- 先在
package.json的nsis配置里开启runAfterFinish: true,这样安装完成后会自动启动应用; - 然后在Electron主进程里,通过命令行参数判断是否是首次启动(比如安装器启动时传递
--post-install参数),然后执行对应逻辑:
// 主进程main.js const { app } = require('electron'); app.whenReady().then(() => { const isPostInstall = process.argv.includes('--post-install'); if (isPostInstall) { // 这里写安装完成后要执行的应用内逻辑,比如打开欢迎页面 console.log('执行安装后初始化操作'); } });
要传递这个参数的话,需要在自定义NSIS脚本里修改启动命令:
Function .onInstSuccess ; 启动应用并传递--post-install参数 ExecWait '"$INSTDIR\${APP_EXECUTABLE}" --post-install' FunctionEnd
另外,如果你只是想简单启动应用,直接在package.json的nsis里设置runAfterFinish: true就够了,不需要额外写脚本。
内容的提问来源于stack exchange,提问作者LonsomeHell




