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...

相关推荐
凤凰AI几秒前
Python知识点4-嵌套循环&break和continue使用&死循环
开发语言·前端·python
Lazy_zheng14 分钟前
虚拟 DOM 到底是啥?为什么 React 要用它?
前端·javascript·react.js
多啦C梦a15 分钟前
前端按钮大撞衫,CSS 模块化闪亮登场!
前端·javascript·面试
拾光拾趣录19 分钟前
WebRTC深度解析:从原理到实战
前端·webrtc
TreeNewBeeMVP23 分钟前
Vue 3 核心原理剖析:响应式、编译与运行时优化
前端
哒哒哒5285201 小时前
vue3基础知识
前端
FogLetter1 小时前
受控组件 vs 非受控组件:React表单的双面哲学
前端·react.js
拾光拾趣录1 小时前
前端工程化 | package.json 中的 sideEffects 属性
前端·前端工程化
西瓜树枝1 小时前
RxJS 轮询策略:如何避免请求雪崩与数据丢失
前端