Electron Forge 通用Mac构建未传递指定arch参数问题
解决Electron Forge构建Mac通用版时ffmpeg-static架构不匹配问题
方案1:通过Electron Forge预构建钩子注入架构变量
Electron Forge构建universal包时,会先分别构建x64和arm64的单架构包再合并,可利用prePackage钩子在单架构构建阶段设置环境变量,强制ffmpeg-static编译对应架构的二进制:
- 修改项目根目录的
forge.config.js,添加钩子配置:
module.exports = { // 保留原有配置... hooks: { prePackage: async (config, target) => { // 仅处理单架构构建流程(universal构建会触发两次单架构构建) if (target.arch !== 'universal') { // 设置npm架构参数,让ffmpeg-static识别目标架构 process.env.npm_config_arch = target.arch; // 强制重新构建ffmpeg-static const { execSync } = require('child_process'); execSync('npm rebuild --force ffmpeg-static', { stdio: 'inherit' }); } } } };
- 核心逻辑:当Forge分别构建x64和arm64包时,钩子会自动设置对应架构的环境变量,触发ffmpeg-static重新下载匹配的二进制文件,最终合并为universal包时双架构文件都会存在。
方案2:手动预编译双架构依赖并合并
如果钩子方案未生效,可手动生成双架构的ffmpeg二进制后合并:
- 在M1机器上,先编译x64版本依赖:
npm rebuild --arch=x64 --force ffmpeg-static # 备份x64架构的ffmpeg二进制 cp node_modules/ffmpeg-static/ffmpeg ./ffmpeg-x64
- 再编译arm64版本依赖:
npm rebuild --arch=arm64 --force ffmpeg-static cp node_modules/ffmpeg-static/ffmpeg ./ffmpeg-arm64
- 使用
lipo工具合并为通用二进制:
lipo -create ./ffmpeg-x64 ./ffmpeg-arm64 -output node_modules/ffmpeg-static/ffmpeg
- 执行通用构建命令:
electron-forge make --platform darwin --arch universal
方案3:给ffmpeg-static打补丁适配universal架构
通过patch-package工具修改ffmpeg-static的下载逻辑,让它自动处理universal架构的双二进制下载与合并:
- 安装依赖:
npm install patch-package --save-dev
- 打开
node_modules/ffmpeg-static/index.js,修改下载逻辑:- 添加对
universal架构的判断,同时下载x64和arm64的二进制文件 - 调用
lipo命令合并两个二进制文件到最终路径
- 添加对
- 生成并保存补丁:
npx patch-package ffmpeg-static
- 后续每次执行
npm install时,补丁会自动应用,无需重复操作。
内容的提问来源于stack exchange,提问作者Ethan
相关产品推荐
相关产品推荐

