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判断),出了问题要发布更高的版本号来覆盖,而不是重发同一版本。
打包和制作安装包
打包工具做两件事:
- 打包:把应用代码(通常已经用 Vite、Webpack 等打包成少量文件)放进 Electron 的 resources 目录,修改可执行文件名、图标和元数据。代码可以合并成
app.asar归档,在未使用打包器时能改善 Windows 等平台上的文件读取性能。 - 制作安装包:生成 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 和多种发布源。两者都能满足常见需求,按团队现有流程选择。