升级electron11踩坑

3/1/2021 JavaScript

# mac 的 arm64 打包

  1. 命令:
electron-builder build --mac dmg --arm64
1
  1. package.json 中的 build 字段:
"mac": {
    "target": ["dmg", "zip", "mas"]
}
1
2
3

ps:如果是打包 x64 的平台,不需要--arm64,如果是想打两个平台包,则是:

electron-builder build --mac dmg --x64 --arm64

1
2

可以发现。上述是指定包的格式是 dmg,开发模式下没问题,但对于生产环境下的 MacOS 来说,是需要.zip 包去支持自动更新的。这里采用 ProgrammticAPI 的方式:

const builder = require("electron-builder");

const config = {
  mac: {
    target: [
      { target: "dmg", arch: "arm64" },
      { target: "zip", arch: "arm64" },
    ],
  },
};

builder.build(builder.Platform.MAC.createTarget(), config);
1
2
3
4
5
6
7
8
9
10
11
12

# 在 macOS 上 electron 运行时的 arch 不对

背景:开发时运行的 electron 是 x64 的架构,然而打包的 electron-build 使用的 electron 是 arm64 架构。

原因:在不指定npm_config_arch的情况下,默认获取的是process.arch,因为当期的 node 版本是 14.15.3,在 m1 芯片是通过 rosette2 运行的兼容模式。所以获取的 arch 是 x64。

具体的影响代码:开发时是通过@electron/get这个包去下载 electron 的发布版本文件。这里发现在node_modules/electron-chromedriverdownload-chromedriver.js使用的下载配置:

const { downloadArtifact } = require("@electron/get");

function download(version) {
  return downloadArtifact({
    version,
    artifactName: "chromedriver",
    platform: process.env.npm_config_platform,
    arch: process.env.npm_config_arch,
    rejectUnauthorized: process.env.npm_config_strict_ssl === "true",
    quiet:
      ["info", "verbose", "silly", "http"].indexOf(
        process.env.npm_config_loglevel
      ) === -1,
  });
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

解决方案:在 m1 芯片的机器上。指定~/.zshrc的环境变量。

export npm_config_arch=arm64
1
Last Updated: 2/21/2022, 11:35:56 AM