打包配置 #

一、打包工具概述 #

1.1 主流打包工具 #

工具 特点 推荐度
electron-builder 功能强大、配置简单 推荐
electron-forge 官方工具、模块化 推荐
electron-packager 简单易用 一般

1.2 打包流程 #

text
源代码
    │
    ▼
┌─────────────────┐
│   依赖安装       │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│   代码构建       │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│   资源打包       │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│   生成安装包     │
└────────┬────────┘
         │
         ▼
    安装包/可执行文件

二、electron-builder #

2.1 安装 #

bash
npm install electron-builder --save-dev

2.2 package.json 配置 #

json
{
    "name": "my-electron-app",
    "version": "1.0.0",
    "description": "我的 Electron 应用",
    "main": "electron/main.js",
    "author": "Your Name",
    "license": "MIT",
    "scripts": {
        "start": "electron .",
        "build": "electron-builder",
        "build:win": "electron-builder --win",
        "build:mac": "electron-builder --mac",
        "build:linux": "electron-builder --linux"
    },
    "build": {
        "appId": "com.example.myapp",
        "productName": "My App",
        "directories": {
            "output": "dist",
            "buildResources": "build"
        },
        "files": [
            "electron/**/*",
            "src/**/*",
            "package.json"
        ],
        "mac": {
            "icon": "build/icon.icns",
            "category": "public.app-category.productivity",
            "target": ["dmg", "zip"]
        },
        "win": {
            "icon": "build/icon.ico",
            "target": ["nsis", "portable"]
        },
        "linux": {
            "icon": "build/icon.png",
            "target": ["AppImage", "deb"]
        }
    },
    "devDependencies": {
        "electron": "^28.0.0",
        "electron-builder": "^24.9.1"
    }
}

2.3 独立配置文件 #

yaml
# electron-builder.yml
appId: com.example.myapp
productName: My App
copyright: Copyright © 2024

directories:
    output: dist
    buildResources: build

files:
    - electron/**/*
    - src/**/*
    - package.json
    - "!**/*.map"
    - "!**/node_modules/*/{CHANGELOG.md,README.md}"

extraResources:
    - resources/**/*

mac:
    icon: build/icon.icns
    category: public.app-category.productivity
    hardenedRuntime: true
    gatekeeperAssess: false
    entitlements: build/entitlements.mac.plist
    entitlementsInherit: build/entitlements.mac.plist
    target:
        - target: dmg
          arch:
              - x64
              - arm64
        - target: zip
          arch:
              - x64
              - arm64

dmg:
    contents:
        - x: 130
          y: 220
        - x: 410
          y: 220
          type: link
          path: /Applications

win:
    icon: build/icon.ico
    target:
        - target: nsis
          arch:
              - x64
              - ia32
        - target: portable
          arch:
              - x64

nsis:
    oneClick: false
    allowToChangeInstallationDirectory: true
    createDesktopShortcut: true
    createStartMenuShortcut: true
    installerIcon: build/icon.ico
    uninstallerIcon: build/icon.ico

linux:
    icon: build/icon.png
    category: Utility
    maintainer: your@email.com
    target:
        - target: AppImage
          arch:
              - x64
        - target: deb
          arch:
              - x64

appImage:
    systemIntegration: ask

deb:
    priority: optional

2.4 打包命令 #

bash
# 打包所有平台
npm run build

# 打包指定平台
npm run build:win
npm run build:mac
npm run build:linux

# 打包指定架构
electron-builder --win --x64
electron-builder --mac --arm64

# 打包指定格式
electron-builder --win nsis
electron-builder --mac dmg

# 不构建直接打包
electron-builder --dir

2.5 图标准备 #

text
build/
├── icon.icns     # macOS 图标 (512x512)
├── icon.ico      # Windows 图标 (256x256)
├── icon.png      # Linux 图标 (512x512)
└── background.png # Windows 安装背景 (可选)

三、electron-forge #

3.1 安装 #

bash
npm install -g @electron-forge/cli
npx electron-forge import

3.2 配置文件 #

javascript
// forge.config.js
module.exports = {
    packagerConfig: {
        name: 'My App',
        executableName: 'my-app',
        appBundleId: 'com.example.myapp',
        icon: 'build/icon',
        asar: true,
        ignore: [
            /^\/\.git/,
            /^\/node_modules/,
            /^\/src/
        ]
    },
    makers: [
        {
            name: '@electron-forge/maker-squirrel',
            config: {
                name: 'my-app',
                iconUrl: 'https://example.com/icon.ico',
                setupIcon: 'build/icon.ico'
            }
        },
        {
            name: '@electron-forge/maker-zip',
            platforms: ['darwin']
        },
        {
            name: '@electron-forge/maker-deb',
            config: {}
        },
        {
            name: '@electron-forge/maker-rpm',
            config: {}
        }
    ],
    publishers: [
        {
            name: '@electron-forge/publisher-github',
            config: {
                repository: {
                    owner: 'your-username',
                    name: 'your-repo'
                },
                prerelease: false
            }
        }
    ]
};

3.3 打包命令 #

bash
# 开发
npm start

# 打包(不生成安装包)
npm run package

# 生成安装包
npm run make

# 发布
npm run publish

四、打包优化 #

4.1 减小体积 #

json
{
    "build": {
        "files": [
            "electron/**/*",
            "src/**/*",
            "!**/*.map",
            "!**/*.ts",
            "!**/node_modules/*/{test,__tests__,tests,examples,example,docs}",
            "!**/node_modules/.bin"
        ],
        "asarUnpack": [
            "resources/**/*"
        ]
    }
}

4.2 ASAR 打包 #

javascript
// ASAR 是一种归档格式,可以加快加载速度
// 默认启用,可以排除某些文件

{
    "build": {
        "asar": true,
        "asarUnpack": [
            "native-module.node",
            "resources/**/*"
        ]
    }
}

4.3 依赖优化 #

json
{
    "dependencies": {
        "只包含生产依赖": "..."
    },
    "devDependencies": {
        "开发依赖放这里": "..."
    }
}

五、环境配置 #

5.1 环境变量 #

javascript
// 构建时设置环境变量
{
    "scripts": {
        "build": "cross-env NODE_ENV=production electron-builder"
    }
}

5.2 多环境配置 #

javascript
// electron-builder.js
const config = {
    production: {
        appId: 'com.example.myapp',
        productName: 'My App'
    },
    development: {
        appId: 'com.example.myapp.dev',
        productName: 'My App Dev'
    }
};

module.exports = config[process.env.NODE_ENV || 'production'];

六、签名配置 #

6.1 macOS 签名 #

yaml
mac:
    hardenedRuntime: true
    gatekeeperAssess: false
    entitlements: build/entitlements.mac.plist
    entitlementsInherit: build/entitlements.mac.plist
    provisioningProfile: build/embedded.provisionprofile
xml
<!-- build/entitlements.mac.plist -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.security.cs.allow-jit</key>
    <true/>
    <key>com.apple.security.cs.allow-unsigned-executable-memory</key>
    <true/>
    <key>com.apple.security.cs.disable-library-validation</key>
    <true/>
</dict>
</plist>

6.2 Windows 签名 #

yaml
win:
    certificateFile: build/certificate.pfx
    certificatePassword: ${env.WIN_CERT_PASSWORD}
    sign: scripts/sign.js

七、CI/CD 集成 #

7.1 GitHub Actions #

yaml
# .github/workflows/build.yml
name: Build

on:
    push:
        tags:
            - 'v*'

jobs:
    build:
        runs-on: ${{ matrix.os }}
        strategy:
            matrix:
                os: [macos-latest, windows-latest, ubuntu-latest]
        
        steps:
            - uses: actions/checkout@v4
            
            - name: Setup Node.js
              uses: actions/setup-node@v4
              with:
                  node-version: '20'
            
            - name: Install dependencies
              run: npm ci
            
            - name: Build
              run: npm run build
            
            - name: Upload artifacts
              uses: actions/upload-artifact@v4
              with:
                  name: ${{ matrix.os }}
                  path: dist/

7.2 自动发布 #

yaml
- name: Release
    uses: softprops/action-gh-release@v1
    with:
        files: dist/**
    env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

八、总结 #

8.1 核心要点 #

要点 说明
electron-builder 推荐的打包工具
图标准备 准备各平台图标
体积优化 排除不必要文件
签名 macOS/Windows 签名
CI/CD 自动化构建发布

8.2 下一步 #

现在你已经掌握了打包配置,接下来让我们学习 自动更新,深入了解 Electron 应用的自动更新机制!

最后更新:2026-03-28