背景
最近在修改 electron 的 打包/分发 流程。目前的流程如下:
1、通过 electron-builder 在本地 macOS 上打包出 windows&macOS 安装程序;
2、将配置文件和安装包上传到静态资源服务器;
3、将静态资源访问路径传给 electron-updater 在合适的时机(根据自己业务逻辑需要)下载重新安装;
目前有一个需求是需要增加运营在后台配置是否强制更新的规则,另外目前发布流程涉及到一些手动操作和需要本地机器的问题,所以考虑是否可以将 electron 的 打包/发布/更新 集成到目前的 CI/CD 流程上(gitlab/jenkins);
我考虑的是两种方案:
1、在打包机(ubuntu)上通过 electron-packger 打包出 windows/macOS 的包,再通过脚本上传到对应的发布流程上;
2、使用官方提供的工具 Forge 进行打包/分发;
本文主要是针对这两个方案做一些实践,顺便补充一下 electron-builder的使用。
先说结论,暂时无法直接在 linux 机器上打包 macOS 安装包,了解了一下目前的方案一般是通过例如 git runner, jenkins agent等链接 macOS 机器进行打包后再上传到服务器中,但我们目前没有这个流程,后面有机会实践再详细说一下。
Electron-packager
electron-packager的用法很简单,安装 electron-packager 后,通过以下命令打包对应的应用:
"scripts": {
"start": "electron .",
"packageOS": "electron-packager . lk --platform=mas --arch=x64 --out=./dist --asar --app-version=1.0.0", // 打包 macOS 应用
"packageWin64": "electron-packager . lk --platform=win32 --arch=x64 --out=./dist --asar --app-version=1.0.0", // 打包 64位windows应用
"packageWin32": "electron-packager . lk --platform=win32 --arch=ia32 --out=./dist --asar --app-version=1.0.0" // 打包 32位windows应用
}
结果如下:
可以看到,通过 electron-packager 只能打包出应用程序(没有安装包,直接复制使用),而我需要的是安装包。可能还需要考虑通过 NSIS/pkgbuild 来构建对应的 windows/macOS 安装包,但这个步骤比较繁琐,暂时不考虑继续深入;
Forge
安装了 Forge 相关的依赖后,修改 forge.config.js 配置文件, 进行 windows/macOS 的打包配置:
makers: [
{
name: '@electron-forge/maker-dmg',
config: {
icon: `./assets/lk.icns`,
},
},
{
name: '@electron-forge/maker-squirrel',
config: {
authors: 'vb',
iconUrl: 'https://your_site/favicon.ico',
exe: `${BUILD_NAME}.exe`,
name: BUILD_NAME,
},
}
],
然后执行 windows 打包命令(注意需要安装 Wine & Mono ):
npm run make -- --platform win32
即可得到 windows 应用安装包:
但在打包 macOS 应用时报错: Error: Cannot make for darwin and target dmg: the maker declared that it cannot run on linux。翻了一下应该是不支持, 所以只能作罢(这个方案即使在 macOS 上打包 windows 应用也有问题,后面问题中有记录)。
Electron-builder
Electron-builder其实配置比较多,例如图标,签名,NSIS等。这里以最简单的配置为例:
"scripts": {
"build:mac": "electron-builder -m -c.mac.identity=null", // 无需签名
"build:win": "electron-builder -w -c.win.verifyUpdateCodeSignature=false" // 无需签名
},
"build": {
"mac": {
"target": [
"dmg"
]
},
"win": {
"target": [
"nsis"
]
}
}
在 ubuntu 上可以正常打包出 windows 安装包, e.g.
但在 ubuntu 无法打包出 macOS 安装包
问题记录
1、在 ubuntu 上使用 Forge make命令时报错: Error: Cannot make for deb, the following external binaries need to be installed: dpkg, fakeroot;
需要安装 dpkg&fakeroot 后再进行 make, dpkg 是ubuntu系统的包管理工具,fakeroot是获取超级用户的管理权限工具;
2、在非windows平台上打包windows应用需要安装Wine(Wine 是一个用于在类Unix操作系统(如Linux和macOS)上运行Windows程序的兼容层)和Mono(Mono 提供了一个在非Windows系统上运行.NET 应用程序的强大工具集);
3、macOS 使用 Forge 打包 windows 应用报错: Error {message: `Failed with exit code: 255 Output: System.AggregateException: One or more errors occurred. () ---> System.Exception
关联issue: github.com/Squirrel/Sq…, 未处理;
总结
我针对自己的使用场景总结一下:
目前 electron 打包/分发主要有三种方式:
1、electron-builder;
2、electron-packger;
3、electron-forge;
针对我想将 打包/分发 流程集成到 CI/CD 上的想法目前无法实现,主要原因如下:
1、在 ubuntu 系统上可以通过 electron-packager 打包出 windows/macOS 应用,但非安装包;
2、在 ubuntu 系统上无法使用 electron-builder 打包 macOS 应用安装包;
3、在 ubuntu 系统上无法通过 electron-forge 打包 macOS 应用安装包;
因为我没有 macOS 作为打包机, 还是只能在本地 macOS 机器进行打包 windows & macOS 应用。对于强制更新的需求通过在 electron-updater 外再套一层业务逻辑接口(是否需要强制更新)来实现.
参考内容
1、Electron Forge: www.electronforge.io/
2、Electron-packger: github.com/electron/pa…
3、Why Electron Forge: www.electronforge.io/core-concep…
4、Electronforge build app for other platform: stackoverflow.com/questions/6…