Electron 之 electron-builder
前言
electron-builder 和 electron-forge 是两个比较流行的打包工具。
Hello from Electron React Boilerplate | Electron React Boilerplate 是使用 electron-builder 的模板。
原理
应该是包装了这几个工具: API - electron-builder
maker 的实现
主要看 win 和 mac 平台的:
- Squirrel/Squirrel.Windows: An installation and update framework for Windows desktop apps
- forge 使用的是 electron/windows-installer: Build Windows Installers for Electron apps 包装的工具,这个工具好像不支持自定义安装路径
- erb 是自定义的,推荐使用
NSIS替代Squirrel.Windows, 支持allowToChangeInstallationDirectory配置, electron-builder/packages/app-builder-lib/src/targets/nsis at master · electron-userland/electron-builder
- Squirrel/Squirrel.Mac: :shipit: Cocoa framework for updating OS X apps :shipit:
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-updater 做监听。quitAndInstall 会被触发流程:
-
入口都是通过
checkForUpdatesAndNotify或者checkForUpdates触发的。notify调用的是Electron的Notification组件。-
调用
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-depspackage