Electron应用安装包 打包/分发 踩坑记录

背景

最近在修改 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 后,通过以下命令打包对应的应用:

json 复制代码
  "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 的打包配置:

css 复制代码
  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 ):

arduino 复制代码
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等。这里以最简单的配置为例:

json 复制代码
  "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...

相关推荐
崔庆才丨静觅3 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60614 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了4 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅4 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅4 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅5 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment5 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅5 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊5 小时前
jwt介绍
前端
爱敲代码的小鱼5 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax