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 中的一方解决这个问题之前,这算是个低成本的折中方案。