Electron 之 electron-builder


前言

electron-builderelectron-forge 是两个比较流行的打包工具。

Hello from Electron React Boilerplate | Electron React Boilerplate 是使用 electron-builder 的模板。

原理

应该是包装了这几个工具: API - electron-builder

maker 的实现

主要看 win 和 mac 平台的:

CLI

Command Line Interface (CLI) - electron-builder

build

最基础的构建项目的命令, 包含了 pack, make, publish.

—prepackaged

only to pack your electron app in a AppImage, Snaps, Debian package, NSIS, macOS installer component package (pkg) and other distributable formats.

install-app-deps

To ensure your native dependencies always matched the electron version, simply add script “postinstall”: “electron-builder install-app-deps” to your package.json.

[install-app-deps] what does it do? · Issue #1906 · electron-userland/electron-builder

应该是安装内层的 app dependencies, 也就是 release/app/package.json 里面的依赖。

node-gyp-rebuild

Rebuild own native code

配置 nodeGypRebuild 决定是否执行 node-gyp rebuild, 不要直接使用 npm 配置 configuring electron headers??使用 electron-build node-gyp-rebuild。 源码: electron-builder/packages/app-builder-lib/src/util/yarn.ts at master · electron-userland/electron-builder, 看样子就是调用 node-gyp 在不同平台编译了下

erb 里面, 是调用 electron-rebuild

start

Run application in a development mode using electron-webpack

erb 里面的话, 一般不用这个, 而是使用 electronmon, 执行 cross-env NODE_ENV=development electronmon -r ts-node/register/transpile-only .

自动更新方案

electron-builder 没有采取 Forge 那套基于 Electron 自身的 autoUpdate 方案, 而是自己实现了一套类似,windows 使用 nsis 安装程序的方案。

electron-builder/packages/electron-updater/src/BaseUpdater.ts at master · electron-userland/electron-builder

什么时机触发的更新程序

代码中,需要我们自己去调用 electron-updater 做监听。quitAndInstall 会被触发流程:

  • 入口都是通过 checkForUpdatesAndNotify 或者 checkForUpdates 触发的。 notify 调用的是 ElectronNotification 组件。

    • 调用 checkForUpdates 检测服务器是否有可下载

    • doCheckForUpdates 会触发 update-not-available事件 或者 onUpdateAvaiable 方法

    • 能下载的, 会触发 update-available 事件,并且返回调用 downloadUpdate 方法

    • 调用 doDownloadUpdate 返回下载进度, 这个方法由具体的 NsisUpdater 或者 MacUpdater 实现

    • 调用 executeDownload 的时候, 这个在 BaseUpdater 中实现, 触发 addQuitHandler

    • 调用 addQuitHandler 中,会调用 install, 这个在 BaseUpdater 中, 添加监听 this.app.quit 事件, app 是这个初始化的,具体实现

    • 调用 install 中, 会调用 doInstall 方法, 这个在 NsisUpdater

    • 调用 doInstall 中, 这个也是被 quitAndInstall 触发的底层逻辑。具体实现了各平台如何调用更新安装包的

    • doInstall 方法具体调用的, 它是被 install 调用的,

electron-updater 中类的关系:

  • NsisUpdate 继承自 BaseUpdate继承自AppUpdate

erb 中是如何使用的

  • postinstall: 调用 install-app-deps
  • package