electron-builder 在 macOS Sonoma 上构建文件受损问题的解决方法

循此苦旅 · 02-06

Electron 的构建工具之一 —— electron-builder 对 macOS 的支持做得不够及时,一个严重的问题是:在新版本系统上 build 的程序只能在本地正常运行,其他人下载时,会显示 “app is damaged”,无法运行。我看到几个帖子都抱怨了这个问题(帖子帖子)。

前两天我也遇到了这个问题,我的运行环境:

  • macOS 14 Sonoma
  • Node 20
  • Electron 22.0.0
  • electron-builder 23.6.0

两个“彻底”的解决方法

使用 macOS Rosseta

在旧版本系统上开发,可以绕过这个问题,但估计大多数人都不想在自己崭新的 M2/M3 机器上安装一个旧系统。

成为 Apple Developer

每年交 100 美元,成为 Apple 认证的开发者,这样在 build 时就可以提供密钥,还可以上线 App Store。

缺点是对于纯兴趣开发,只偶尔需要 build 的人,给 Apple 交一笔钱有点浪费。

一个薅羊毛的解决方法

这两个方法我都不想用,于是用了第三种方案:在 GitHub 的服务器上远程 build。

原理是:

  • 利用 GitHub Action,在 repo 接收到特定 tag 的 push 时,触发一个 build 动作
  • 把运行环境设置成旧一点的 macOS
  • build 后,自动创建一个仅自己可见的 draft release,并把 build 出来的文件上传进去
  • 自己从 draft release 里下载附件,得到一个正常工作的 dmg 文件

一番失败的尝试后,我弄出了下面的 Action file:

name: electron-builder

on: 
  push:
    tags:
      - 'draft-release'

jobs:
  build_on_mac:
    runs-on: macos-latest
    steps:
    - name: Check out Git repo
      uses: actions/checkout@v2

    - uses: actions/setup-node@master
      with:
        node-version: 20
    - name: Install dependencies
      run: yarn
    - name: Build for MacOS
      run: yarn electron-builder --mac # YOUR BUILD COMMAND FOR MAC

    - name: Create draft release
      id: create_release
      uses: actions/create-release@v1
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        tag_name: v0.0.0
        release_name: draft-release
        draft: true
        prerelease: false

    - uses: actions/[email protected]
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        upload_url: ${{ steps.create_release.outputs.upload_url }}
        asset_path: ./dist/<YOUR DIST FILENAME>
        asset_name: dist/<YOUR DIST FILENAME>
        asset_content_type: application/octet-stream

里面的 tag 、 filename 等都是 hardcoded,理想情况应该是自动获取 push 里的信息生成相应的 release 。

目前 GitHub Action 使用的 macOS 是 11 和 12,electron-builder 可以创建出正常的 dmg 文件。在 electron-builder 和 Apple 中的一方解决这个问题之前,这算是个低成本的折中方案。

Coding JS
Theme Jasmine by Kent Liao, modified by Nick Ning