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-deps
package