electron-builder NSIS自定义宏在打包时执行而非安装时求助
解决electron-builder中NSIS自定义脚本在打包时执行而非安装时执行的问题
我明白你遇到的问题了——你在installer.nsh里定义的NSIS宏中使用了!system命令,但这些命令居然在electron-builder打包生成安装包的阶段就执行了,而不是用户运行安装程序的时候才触发。这其实是因为你用错了NSIS的命令类型。
问题根源
!system是NSIS的预处理器指令,它的作用是在NSIS脚本编译(也就是electron-builder打包过程)时执行系统命令,而不是在安装程序运行时执行。如果你想让命令在用户安装/卸载过程中触发,需要使用NSIS的运行时执行命令,比如Exec或ExecWait。
解决方案
把宏里的!system替换成NSIS运行时命令,同时注意调整路径变量——打包时的${BUILD_RESOURCES_DIR}在安装阶段是不存在的,你需要改用NSIS安装时的变量(比如$INSTDIR表示用户选择的安装目录)。
下面是修改后的示例脚本:
!macro customHeader # 注意:customHeader属于预处理器阶段的宏,仅在编译安装包时生效 # 如果需要安装时执行逻辑,请将代码移到preInit、customInit等运行时宏中 !macroend !macro preInit # preInit在安装程序初始化阶段触发,用ExecWait执行系统命令 ExecWait 'cmd.exe /c echo "preInit" > "$INSTDIR\preInit.log"' !macroend !macro customInit ExecWait 'cmd.exe /c echo "customInit" > "$INSTDIR\customInit.log"' !macroend !macro customInstall # customInstall在安装流程中触发,可执行安装相关的系统命令 ExecWait 'cmd.exe /c echo "customInstall" > "$INSTDIR\customInstall.log"' !macroend !macro customUnInstall # 卸载流程触发,使用$INSTDIR定位安装目录 ExecWait 'cmd.exe /c echo "customUnInstall" > "$INSTDIR\customUnInstall.log"' !macroend
关键说明
ExecvsExecWait:Exec会异步执行命令,安装程序会继续往下走;ExecWait会等待命令执行完成后再继续,适合需要确保命令执行完毕的场景。- 路径变量:安装时使用
$INSTDIR(用户选择的安装目录)、$TEMP(系统临时目录)等NSIS内置的运行时变量,不要用打包阶段的${BUILD_RESOURCES_DIR}。 - 调用系统命令:NSIS本身没有
echo这类命令,需要通过cmd.exe /c来调用Windows命令行执行。
这样修改后,你的自定义命令就会在用户运行安装/卸载程序时触发,而不是在electron-builder打包阶段执行了。
内容的提问来源于stack exchange,提问作者Kid
相关产品推荐
相关产品推荐

