Electron无asar打包后child_process.spawn正常,制作DMG后失效求助
解决Mac上Electron DMG打包后child_spawn无法运行bin文件的问题
我之前也碰到过一模一样的问题,核心根源是DMG打包完成后,应用的运行工作目录和你直接运行.app文件时完全不同,导致你用的相对路径./bin根本找不到目标二进制文件。下面是针对性的解决步骤:
1. 替换相对路径为绝对路径,用__dirname准确定位文件
别再依赖相对路径了,Electron提供的__dirname会指向当前脚本所在的实际目录,不管应用被打包成什么样,这个路径都是可靠的。修改你的spawn代码:
const { spawn } = require('child_process'); const path = require('path'); // 假设bin文件和当前脚本在同一目录下,构建绝对路径 const binAbsolutePath = path.join(__dirname, './bin'); // 使用绝对路径启动进程 const childProcess = spawn(binAbsolutePath);
2. 确保bin文件拥有可执行权限
Mac系统对文件权限管控严格,打包前一定要给bin文件加上可执行权限,不然即使路径对了也无法运行:
chmod +x ./bin
3. 修正打包命令的参数错误
你原来的electron-packager命令里-no--asar是写错的,正确的参数应该是--no-asar,修正后的完整打包命令:
electron-packager . --overwrite --no-asar --platform=darwin --arch=x64 --icon=./app/assets/icons/mac/1024.icns --prune=true --out=release-builds
另外--prune=true会清理node_modules里的冗余文件,要确保你的bin文件不在被清理的范围内,建议把bin放在app目录下的独立文件夹(比如app/bin),避免被误删。
4. 验证DMG打包前的.app文件是否包含bin
在运行electron-installer-dmg之前,先打开release-builds/simple-darwin-x64/simple.app/Contents/Resources/app目录,确认bin文件确实存在。如果找不到,说明electron-packager打包时没把它包含进去,需要调整文件结构或者打包参数。
至于Linux上没有这个问题,是因为Linux下应用运行的工作目录逻辑和Mac的DMG打包结构不一样,用绝对路径就能彻底避开这个平台差异问题。
内容的提问来源于stack exchange,提问作者Dominika
相关产品推荐
相关产品推荐

