Ubuntu20.x下electron-builder多架构多平台打包问题求助
背景
我正在使用ubuntu machine 20.x,原本通过electron-packager构建Electron应用。现希望使用electron-builder实现全architectures、platform、distributions类型(如zip、snap、exe、msi等)的打包,尝试使用electron-builder -mwl命令时遇到以下问题:
问题列表
- 收到警告
"electronbuilder-deps": "electron-builder install-app-deps"; - 需将部分文件夹复制到
resources目录,其余放到electron.exe根目录,不知如何配置; - 出现错误:
To ensure your native dependencies are always matched electron version, simply add script `"postinstall": "electron-builder install-app-deps" to your `package.json` • writing effective config file=dist/builder-effective-config.yaml ⨯ /workspace/desktop-cgi/node_modules/iconv-corefoundation/lib/native.node: invalid ELF header failedTask=build stackTrace=Error: /workspace/desktop-cgi/node_modules/iconv-corefoundation/lib/native.node: invalid ELF header
当前package.json中的build配置如下:
"build": { "appId": "com.example.${name}", "asar": true, "beforePack": "", "afterPack": "", "files": [ "index.js", "src/*", "src/**/*", "binaries/**/*", "binaries/**/**/*", "node_modules/**/*", "package.json" ], "directories": { "buildResources": "resources" }, "extraFiles": [ "credentials" ], "publish": null, "linux": { "target": [ { "target": "dir", "arch": [ "x64", "ia32", "armv7l", "arm64", "x64", "ia32", "armv7l", "arm64" ] }, { "target": "deb", "arch": [ "x64", "ia32", "armv7l", "arm64", "x64", "ia32", "armv7l", "arm64" ] }, { "target": "apk", "arch": [ "x64", "ia32", "armv7l", "arm64", "x64", "ia32", "armv7l", "arm64" ] }, { "target": "rpm", "arch": [ "x64", "ia32", "armv7l", "arm64", "x64", "ia32", "armv7l", "arm64" ] }, { "target": "appImage", "arch": [ "x64", "ia32", "armv7l", "arm64", "x64", "ia32", "armv7l", "arm64" ] }, { "target": "tar.xz", "arch": [ "x64", "ia32", "armv7l", "arm64", "x64", "ia32", "armv7l", "arm64" ] }, { "target": "zip", "arch": [ "x64", "ia32", "armv7l", "arm64", "x64", "ia32", "armv7l", "arm64" ] } ] }, "win": { "target": [ { "target": "dir", "arch": [ "x64", "ia32", "armv7l", "arm64", "x64", "ia32", "armv7l", "arm64" ] }, { "target": "nsis", "arch": [ "x64", "ia32", "armv7l", "arm64", "x64", "ia32", "armv7l", "arm64" ] }, { "target": "appx", "arch": [ "x64", "ia32", "armv7l", "arm64", "x64", "ia32", "armv7l", "arm64" ] }, { "target": "msi", "arch": [ "x64", "ia32", "armv7l", "arm64", "x64", "ia32", "armv7l", "arm64" ] }, { "target": "portable", "arch": [ "x64", "ia32", "armv7l", "arm64", "x64", "ia32", "armv7l", "arm64" ] }, { "target": "nsisWeb", "arch": [ "x64", "ia32", "armv7l", "arm64", "x64", "ia32", "armv7l", "arm64" ] }, { "target": "squirrel", "arch": [ "x64", "ia32", "armv7l", "arm64", "x64", "ia32", "armv7l", "arm64" ] }, { "target": "zip", "arch": [ "x64", "ia32", "armv7l", "arm64", "x64", "ia32", "armv7l", "arm64" ] }, { "target": "tar.xz", "arch": [ "x64", "ia32", "armv7l", "arm64", "x64", "ia32", "armv7l", "arm64" ] } ] }, "mac": { "target": [ { "target": "dir", "arch": [ "x64", "ia32", "armv7l", "arm64", "x64", "ia32", "armv7l", "arm64" ] }, { "target": "dmg", "arch": [ "x64", "ia32", "armv7l", "arm64", "x64", "ia32", "armv7l", "arm64" ] }, { "target": "zip", "arch": [ "x64", "ia32", "armv7l", "arm64", "x64", "ia32", "armv7l", "arm64" ] }, { "target": "pkg", "arch": [ "x64", "ia32", "armv7l", "arm64", "x64", "ia32", "armv7l", "arm64" ] }, { "target": "mas", "arch": [ "x64", "ia32", "armv7l", "arm64", "x64", "ia32", "armv7l", "arm64" ] }, { "target": "tar.xz", "arch": [ "x64", "ia32", "armv7l", "arm64", "x64", "ia32", "armv7l", "arm64" ] } ] } }
问题解决方案
1. 解决"electronbuilder-deps"警告
这个警告是提示你配置自动同步native依赖的脚本,避免版本不匹配。直接在package.json的scripts字段里添加postinstall脚本:
"scripts": { // 其他脚本... "postinstall": "electron-builder install-app-deps" }
添加后,每次执行npm install或yarn install后,会自动重新构建所有native模块,确保它们适配当前项目的Electron版本,彻底消除这个警告。
2. 配置文件夹的打包路径
要实现部分文件夹到resources目录,其余到应用根目录,需要用到extraResources和extraFiles两个配置项:
放到应用根目录:继续用
extraFiles,比如你当前配置的"credentials"文件夹,打包后会出现在electron.exe同级目录。如果有多个文件夹,直接添加到数组即可:"extraFiles": ["credentials", "other-root-folder"]放到resources目录:使用
extraResources,可以指定源路径和目标路径。比如要把assets文件夹打包到resources/assets:"extraResources": [ { "from": "assets/", "to": "assets/" }, { "from": "configs/", "to": "configs/" } ]注意:
directories.buildResources是指定你项目中存放构建资源(比如图标、安装包脚本)的源目录,打包时这个目录下的文件会自动放到打包后的resources目录,但如果是其他位置的文件夹要放到resources,就必须用extraResources配置。
3. 修复"invalid ELF header"错误
这个错误是因为iconv-corefoundation的native二进制文件是针对本地架构编译的,跨平台打包时出现了架构不匹配,或者缓存的旧版本干扰。按以下步骤解决:
清理依赖并重新安装:
rm -rf node_modules package-lock.json yarn.lock npm install npm run postinstall # 手动触发native依赖构建单独重建问题模块:
如果清理后还是报错,用electron-rebuild单独处理iconv-corefoundation:npx electron-rebuild -f -w iconv-corefoundation优化跨平台打包环境:
在Ubuntu上跨平台打包Windows/macOS应用,建议用Docker容器(比如electronuserland/builder镜像),避免本地系统的native模块污染构建环境。替换为纯JS模块:
如果iconv-corefoundation对你的项目不是必须的,考虑替换成纯JavaScript实现的iconv-lite,完全避免native依赖问题:npm uninstall iconv-corefoundation npm install iconv-lite
优化你的build配置
当前配置里有很多重复的架构列表,比如每个target的arch都重复写了两遍,完全可以简化。另外macOS现在已经不支持ia32架构,建议删除无效配置,示例优化后的linux配置:
"linux": { "target": [ "dir", "deb", "apk", "rpm", "appImage", "tar.xz", "zip" ], "arch": ["x64", "ia32", "armv7l", "arm64"] }
这样所有linux target都会使用统一的架构列表,配置更简洁。同理可以优化win和mac的配置。
内容的提问来源于stack exchange,提问作者Gary

