You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:06:25