Electron打包工具electron-builder&electron-packager
概述
Electron 应用有三款主流打包工具:electron-forge(官方推荐)、electron-builder 和 electron-packager。本节对比三者的特性差异,重点介绍 electron-builder 的跨平台打包能力,帮助开发者根据实际需求做出技术选型。
打包工具对比
| 维度 | electron-builder | electron-forge | electron-packager |
|---|---|---|---|
| 官方地位 | 社区主流 | Electron 官方推荐 | 早期方案,逐步弃用 |
| 跨平台支持 | 优秀(macOS/Windows/Linux) | 良好 | 一般 |
| 配置复杂度 | 中等,功能丰富 | 较高,多包架构 | 简单 |
| 新特性跟进 | 社区驱动,略有滞后 | 紧跟 Electron 最新版本 | 停止维护 |
| 自动更新 | 内置 electron-updater | 内置 | 需额外配置 |
| 代码签名 | 完善(macOS/Windows) | 完善 | 基础支持 |
| 输出格式 | DMG/NSIS/AppImage/RPM/DEB 等 | 多种格式 | 文件夹/ZIP |
| 社区生态 | 成熟,大量实践案例 | 官方文档完善 | 逐渐减少 |
electron-builder 核心优势
1. 跨平台支持完善
electron-builder 跨端支持:
├── macOS
│ ├── DMG(标准安装包)
│ ├── PKG(安装器格式)
│ └── MAS(Mac App Store 提交格式)
├── Windows
│ ├── NSIS(标准安装程序 .exe)
│ ├── Portable(便携版)
│ └── AppX(Microsoft Store 格式)
└── Linux
├── AppImage(通用格式)
├── DEB(Debian/Ubuntu)
├── RPM(RedHat/Fedora)
└── Pacman(Arch Linux)
text
2. 内置自动更新
electron-builder 内置 electron-updater,支持所有三个平台的自动更新:
import { autoUpdater } from 'electron-updater'
// 检查更新并通知
autoUpdater.checkForUpdatesAndNotify()
autoUpdater.on('update-downloaded', () => {
autoUpdater.quitAndInstall()
})
ts
平台特定更新器:
| 平台 | 更新器类 | 说明 |
|---|---|---|
| Windows | NsisUpdater | NSIS 安装程序的增量更新 |
| macOS | MacUpdater | DMG/PKG 的更新检测 |
| Linux | AppImageUpdater / DebUpdater / RpmUpdater | 根据包类型自动选择 |
3. 代码签名支持
代码签名流程:
├── macOS
│ ├── Apple Developer 证书申请
│ ├── hardenedRuntime 启用
│ └── 公证(Notarization)
├── Windows
│ ├── 代码签名证书购买(EV/OV)
│ └── signtool 签名
└── 通用
└── afterSign 钩子自定义签名流程
text
electron-forge 的特点
多包架构
electron-forge 采用 monorepo 风格的插件架构:
electron-forge 架构:
├── @electron-forge/core
├── @electron-forge/plugin-webpack # Webpack 打包
├── @electron-forge/plugin-vite # Vite 打包
├── @electron-forge/maker-dmg # macOS DMG 生成
├── @electron-forge/maker-nsis # Windows NSIS 生成
├── @electron-forge/maker-appImage # Linux AppImage 生成
└── @electron-forge/publisher-github # GitHub Release 发布
text
官方声明的两大优势
- 最新特性:紧跟 Electron 最新版本,第一时间支持新 API
- 多包架构:各功能模块独立,易于扩展和理解
客观评估:electron-forge 官方文档中强调了这两个优势,但实际上除非确实需要某个最新的 Electron 特性,否则 electron-builder 在跨平台支持、社区资源等方面更具优势。绝大多数生产级 Electron 应用使用的是 electron-builder。
技术选型建议
| 场景 | 推荐工具 | 理由 |
|---|---|---|
| 生产级应用 | electron-builder | 跨平台支持成熟,社区资源丰富 |
| 需要最新 Electron 特性 | electron-forge | 紧跟官方更新节奏 |
| 快速原型验证 | electron-builder | 配置简单,上手快 |
| 已有 electron-forge 项目 | electron-forge | 迁移成本高,保持一致 |
决策流程:
是否需要最新 Electron 特性?
├── 是 → electron-forge
└── 否 → 是否需要跨平台(macOS + Windows + Linux)?
├── 是 → electron-builder
└── 否 → electron-builder(配置更简单)
text
electron-builder 快速上手
基础配置
// package.json
{
"build": {
"appId": "com.example.myapp",
"productName": "My App",
"directories": {
"output": "dist"
},
"mac": {
"target": "dmg",
"category": "public.app-category.productivity"
},
"win": {
"target": "nsis"
},
"linux": {
"target": "AppImage"
}
}
}
json
完整配置示例
// electron-builder 配置支持编程式调用
import builder from 'electron-builder'
import { Platform } from 'electron-builder'
const options = {
appId: 'com.example.myapp',
productName: 'My App',
compression: 'normal' as const,
directories: {
output: 'dist/artifacts',
buildResources: 'build',
},
files: ['dist/**/*'],
mac: {
target: 'dmg',
hardenedRuntime: true,
category: 'public.app-category.productivity',
},
win: {
target: [
{ target: 'nsis', arch: ['x64'] },
{ target: 'portable', arch: ['x64'] },
],
icon: 'build/icon.ico',
},
linux: {
target: ['AppImage', 'deb', 'rpm'],
category: 'Utility',
},
nsis: {
oneClick: false,
allowToChangeInstallationDirectory: true,
createDesktopShortcut: true,
},
}
// 编程式构建
builder.build({
targets: Platform.MAC.createTarget(),
config: options,
})
ts
构建命令
# 安装
npm install electron-builder --save-dev
# 打包(当前平台)
npx electron-builder
# 打包指定平台
npx electron-builder --mac
npx electron-builder --win
npx electron-builder --linux
# 打包多平台
npx electron-builder --mac --win --linux
bash
实践要点
- electron-packager 已逐步被社区弃用,新项目不建议采用
- electron-forge 是官方推荐方案,但 electron-builder 的跨平台支持更成熟
- 绝大多数生产级 Electron 应用使用 electron-builder
- 代码签名是分发应用的必经步骤,macOS 和 Windows 各有不同的签名流程
afterSign钩子可用于在签名后执行自定义操作(如 macOS 公证)- Windows 平台可通过
signtoolOptions配置代码签名证书
↑