前言
我们在开发一款electron桌面应用中,我们希望只要我们发布了最新的版本,用户就会收到新包的更新提示。在electron自带的有autoUpdater,本次我们选择的是electron-updater这个第三方插件。先说一下electron自带的autoUpdater的缺点是没有办法控制什么时候下载(目前我看官方文档是没有这个功能,如果有欢迎指正),且不知道下载的进度;而electron-updater却有这个功能,这个功能最大的好处就是我们可以在正式环境下存在多个版本,时时监听下载进度;
electron-updater的使用说明
1、引入
$ yarn add electron-updater electron-log electron-is-dev
electron-updater自动更新所需的依赖electron-log可将更新的日志存放在本地electron-is-dev判断electron是否为dev环境
2、electron-updater中的各个事件的说明
Event: error
当更新发生错误时触发
返回:
errorError
Event: checking-for-update
当开始检查更新的时候触发
返回:
- 没有返回值
Event: update-available
当检查到有可用的更新包时触发
返回:
{
"version": "0.1.0", // 最新版本号
"files": [{
"url": "text Setup 0.1.0.exe", // 包的名称
"sha512": "xxx",
"size": 899999562, // 包的大小
}],
"path": "text Setup 0.1.0.exe", // 包的名称
"sha512": "xxx",
"relaseDate": "2019-11-07T10:26:23.286Z", // 新包发布时间
"relaseNotes": "修复XXX", // 新包发布内容
}
Event: update-not-available
当检测到没有可用更新时触发
返回:
- 没有返回值
Event: download-progress
监听下载进度
返回:
{
"delta":"22108084", // 差量
"bytesPerSecond": "20243532", // 下载速度
"percent":'73.32491979950667', // 已下载的百分比
"total":"82879166", // 更新包的大小
"transferred": "82879166" // 已下载的包大小
}
Event: update-downloaded
当下载完更新包后触发
返回值:
{
"version": "0.1.0", // 最新版本号
"files": [{
"url": "text Setup 0.1.0.exe", // 包的名称
"sha512": "xxx",
"size": 899999562, // 包的大小
}],
"path": "text Setup 0.1.0.exe", // 包的名称
"sha512": "xxx",
"relaseDate": "2019-11-07T10:26:23.286Z", // 新包发布时间
"relaseNotes": "修复XXX", // 新包发布内容
}
方法:
autoUpdater具有以下方法
-
autoUpdater.checkForUpdates() => Promise<UpdateCheckResult>询问服务器是否有可用更新
-
autoUpdater.checkForUpdatesAndNotify() ⇒ Promise< | UpdateCheckResult>询问服务器是否有更新,下载并通知更新是否可用。
-
autoUpdater.downloadUpdate(cancellationToken) ⇒ Promise<any>开始手动下载更新。如果
autoDownloadoption设置为,则可以使用此方法false返回:
Promise<any>-下载文件的路径。cancelToken CancellationToken
-
autoUpdater.getFeedURL()⇒ undefined| null|String autoUpdater.setFeedURL(options)配置更新提供程序。如果value为
string,则GenericServerOptions的值将设置为url。选项
PublishConfiguration|String|GithubOptions|S3Options|SpacesOptions|GenericServerOptions|BintrayOptions-如果要覆盖中的配置app-update.yml。 -
autoUpdater.channel (getter和setter使用定义自动更新程序将要遵循的频道(请参阅使用频道进行自动更新),
autoUpdater.channel = 'beta'或使用来获取当前频道currentChannel = autoUpdater.channel。 -
autoUpdater.quitAndInstall(isSilent, isForceRunAfter)下载更新后,重新启动应用程序并安装更新。仅应在
update-downloaded发出后调用它。注意:
autoUpdater.quitAndInstall()将首先关闭所有应用程序窗口,之后才发出before-quit事件app。这与正常的退出事件序列不同。isSilentBoolean- 仅Windows以静默模式运行安装程序。默认为false。isForceRunAfter-Boolean即使无提示安装也可以在完成后运行应用程序。不适用于macOS。忽略是否isSilent设置为false。
API
-
autoDownload=true布尔值-发现更新后是否自动下载更新。 -
autoInstallOnAppQuit=true布尔值-是否在应用程序退出时自动安装下载的更新(如果quitAndInstall以前未调用过)。仅适用于Windows和Linux。
-
allowPrerelease=false布尔- *只有GitHub的供应商。*是否允许更新到预发行版本。默认为true应用程序版本是否包含预发行组件(例如0.12.1-alpha.1,此处alpha为预发行组件),否则为false。如果为
true,则允许降级(allowDowngrade将设置为true)。 -
fullChangelog=false布尔- *只有GitHub的供应商。*获取所有发行说明(从当前版本到最新版本),而不仅仅是最新版本。 -
allowDowngrade=false布尔值-是否允许版本降级(当来自Beta频道的用户想要返回稳定频道时)。仅当渠道不同时才考虑在内(就语义版本而言,预发行版本组件)。
-
currentVersionSemVer-当前的应用程序版本。 -
channel字符串-获取更新频道。不适用于GitHub。channel仅在先前设置的情况下,不会从更新配置中返回。 -
requestHeaders[键:字符串]:字符串-请求标头。 -
logger日志您可以通过以下界面传递electronic-log,winston或其他日志:{ info(), warn(), error() }。如果您要禁用日志记录功能,请将其设置为null。 -
signals=new UpdaterSignal(this)UpdaterSignal-为了类型安全,您可以使用信号,例如autoUpdater.signals.updateDownloaded(() => {})代替autoUpdater.on('update-available', () => {})
自动更新示例
- 在
package.json中的配置
{
....
"build": {
"releaseInfo": {
"releaseNotes": "优化我的订单、信息库、角色功能,新增退费、退费订单审核" // 更新的内容
},
"publish": [
{
"provider": "generic",
"url": "http://127.0.0.1:8080/download/", // 推送的地址
"channel": "latest" // 检查更新的渠道
}
],
}
....
}
- 在跟目录下添加
app-updater.yml 和 dev-app-updater.yml文件用作检查更新文件的配置
# 在app-update.yml中配置检查更新的地址,这个地址为正式环境下的更新地址
provider: 'generic'
url: 'http://127.0.0.1:8080/download/'
channel: 'latest'
# 在dev-app-update.yml中配置检查更新的地址,这个地址为开发环境下的地址
provider: 'generic'
url: 'http://127.0.0.1:8080/test-download/'
channel: 'latest'
- 在
APPAutoUpdater.js中
const { autoUpdater } = require('electron-updater')
const Store = require('electron-store')
const path = require('path')
global.store = new Store()
autoUpdater.logger = require('electron-log')
// 监听输出的日志
autoUpdater.logger.transports.file.level = 'info'
// 设置当前的版本号为自动更新的版本号
global.currentVersion = autoUpdater.currentVersion
autoUpdater.autoDownload = false // 将自动下载包设置为false,产品的需求是让用户自己点击更新下载
// 监听自动更新的几个事件
// 监听如果自动更新失败将停止安装
autoUpdater.on('error', () => {
// todo something
})
// 检查更新是否已开始时发出
autoUpdater.on('checking-for-update', () => {})
// 检测有可更新的应用包
autoUpdater.on('update-available', info => {
// todo something
})
// 检测没有可用更新时发出
autoUpdater.on('update-not-available', info => {
// todo something
})
// 下载可更新的安装包
autoUpdater.on('update-downloaded', info => {
// todo something
})
// 监听下载进度
autoUpdater.on('download-progress', info => {
// todo something
})
module.exports = {
checkVersion() {
if (global.isDev) {
autoUpdater.updateConfigPath = path.join(__dirname, '../../dev-app-update.yml')
}
autoUpdater.checkForUpdates()
}
}
- 在electron的主进程中 index.js
// 主页面一旦加载完成后就开始执行检查更新
mainWindow.webContents.on('did-finish-load', () => {
AppUpdater.checkVersion()
})