前端知库

Electron 应用如何打包发布?代码签名、macOS 公证和自动更新要注意什么?

梳理 Electron 应用从打包、制作安装包、Windows 与 macOS 代码签名、Apple 公证到自动更新的发布链路,比较内置 autoUpdater 与 electron-updater。

参考答案

简答

  • 发布流程是:构建前端资源 → 把应用代码和 Electron 二进制打包成各平台应用 → 制作安装包 → 签名(macOS 还要公证)→ 上传到更新源。官方推荐使用 Electron Forge,electron-builder 也是常用方案。
  • macOS 应用需要用 Apple 开发者证书签名,再提交 Apple 公证;没有签名,内置 autoUpdater 依赖的 Squirrel.Mac 根本无法自动更新。
  • Windows 签名用于减少 SmartScreen 等安全警告,Electron 文档介绍了 EV 证书(密钥需存放在认证硬件或云签名服务中)和 Azure 的云签名服务两类方案。
  • 自动更新可以用 Electron 内置的 autoUpdater(基于 Squirrel,支持 macOS 和 Windows),也可以用 electron-builder 的 electron-updater(额外支持 Linux 和下载进度)。
  • 更新相关代码只在打包后运行(用 app.isPackaged 判断),出了问题要发布更高的版本号来覆盖,而不是重发同一版本。

打包和制作安装包

打包工具做两件事:

  1. 打包:把应用代码(通常已经用 Vite、Webpack 等打包成少量文件)放进 Electron 的 resources 目录,修改可执行文件名、图标和元数据。代码可以合并成 app.asar 归档,在未使用打包器时能改善 Windows 等平台上的文件读取性能。
  2. 制作安装包:生成 DMG、ZIP、NSIS、MSI、DEB、RPM、AppImage 等格式。

Electron Forge 内部集成了 @electron/packager、@electron/osx-sign、@electron/notarize;electron-builder 有自己的一套配置。原生模块要针对目标 Electron 版本重新编译,不同架构(x64、arm64)分别构建或制作通用包。

macOS:签名和公证

前提条件:付费的 Apple Developer Program 会员、一台装有 Xcode 的 Mac,以及 Apple 签发的签名证书。

  • 签名证明应用来自谁、未被篡改。签名身份保持一致时,系统才会把新版本识别为同一个应用;否则 safeStorage 和 Cookie 加密可能在每次更新后重新请求钥匙串权限,登录项也可能静默失效。
  • 公证是把签名后的应用上传给 Apple 做自动化检查,确认没有危害用户的行为。Forge 通过 @electron/notarize 完成,@electron/packager 也提供 osxNotarize 选项。
  • Mac App Store 版本有单独的签名和沙箱要求,按官方 MAS 指南处理。

Windows:签名

  • Electron 文档说明,自 2023 年 6 月起,用旧的 OV 证书签名会得到和未签名应用相同的警告,需要 EV 证书。EV 证书的私钥必须存放在认证硬件上,不能直接复制到 CI 机器,所以 CI 中通常使用厂商提供的云签名服务。SmartScreen 的信誉策略由微软调整,以 Electron 和微软当前文档为准。
  • Azure Artifact Signing(原名 Azure Trusted Signing)是微软的云签名服务,文档称它是 Windows 上成本最低的选项,但只在部分国家和地区提供。
  • Forge、Packager 等 Electron 官方工具通过 @electron/windows-sign 和统一的 windowsSign 配置完成签名。

自动更新

内置 autoUpdater + Squirrel

  • 支持 macOS(Squirrel.Mac)和 Windows(Squirrel.Windows)。
  • 公开 GitHub 仓库并发布到 GitHub Releases 的应用,可以用官方免费服务 update.electronjs.org,配合 update-electron-app 模块即可接入。
  • 也可以用静态存储(macOS 读 releases.json,Windows 读 RELEASES)或自建 Hazel、Nuts 等更新服务器。

electron-updater

  • 由 electron-builder 在构建时生成更新元数据,除 macOS、Windows 外还支持 Linux,并提供下载进度事件;支持的安装包格式和分阶段发布配置以 electron.build 当前文档为准。
JavaScript
// 主进程:只在打包后的应用中检查更新
const { app } = require('electron');
const { autoUpdater } = require('electron-updater');

app.whenReady().then(() => {
  if (!app.isPackaged) return;
  autoUpdater.on('error', (err) => console.error('更新失败', err));
  autoUpdater.checkForUpdatesAndNotify();
});

发布中的常见问题

  • 发布出错的版本时,发布一个更高的版本号。重新发布同一版本,已经更新到坏版本的用户不会再收到修复。
  • 更新包和元数据都要走 HTTPS,并保护好签名证书和发布凭据,CI 中使用密钥管理服务而不是把证书提交到仓库。
  • 打包时用 @electron/fuses 关闭不需要的能力,见《Electron 应用的主进程、渲染进程和 IPC 有哪些安全边界?》。

常见追问

  • 不签名能发布吗?可以分发,但 macOS 会阻止或警告用户打开未公证的应用,Windows 会弹出安全警告,并且 macOS 上的自动更新无法工作。
  • Forge 和 electron-builder 怎么选?Forge 是 Electron 官方推荐、使用官方签名和打包模块;electron-builder 配置集中,自带 electron-updater 和多种发布源。两者都能满足常见需求,按团队现有流程选择。