-
electron更新程序接入需要注意每个插件的版本,不然会遇到各种各样的问题;
我使用各个插件的版本:
"electron-builder": "^21.0.0", "electron-updater": "^3.0.0", “node”: '^16.13.2', "vue-cli-plugin-electron-builder": "^2.1.1"
这里用了electron-updater中的autoUpdater API做的软件更新程序;
官网地址:https://www.electron.build/auto-update
先说一下大致思路:
软件更新,需要有一个存放新版本安装包的服务;我采用的是用node的一个插件(http-server)启动本地服务;
先在pakage.json中修改version版本,修改一个比较高的版本打包后放到静态服务内;用于在本地测试,检查到有新的安装包,网下执行更新程序;
接下来写更新程序:
引入autoupdater模块:
import { autoUpdater } from 'electron-updater';
设置安装包所在服务地址:
// 设置服务器更新地址 autoUpdater.setFeedURL({ provider: 'generic', url: http:// 192.xxx.xxx:8080 });
设置退出时是否自动更新
// 退出时是否自动更新 默认为true autoUpdater.autoInstallOnAppQuit = false;
设置是否自动更新,自动更新也就是下载好安装包后自动触发更新;根据自己的需求设置手否自动更新,这里设置自动更新后,就不能再手动调用更新了
// 是否自动更新 不设置electron-updater 默认为true 手动触发更新要设置为false autoUpdater.autoDownload = false
写一个检测的方法;刚进入程序时调用一次;然后设置一个定时器,连续检查
// 检查更新 inspect() { autoUpdater.checkForUpdates(); }
设置定时器用到了node-schedule插件
const schedule = require('node-schedule') // 每隔30分钟检测以此 (用于正式环境) // schedule.scheduleJob('0 30 * * * *', () => this.inspect); // 每隔5秒执行一次(用于本地测试) schedule.scheduleJob('*/5 * * * * *', this.inspect);
监听autoupdater的几个回到事件
// 失败、错误收集 autoUpdater.on('error', (e) => { // do some }); // 在检查更新是否已启动时触发。 autoUpdater.on('checking-for-update', (e) => { // do some }); // 检测到更新可用 autoUpdater.on('update-available', (e) => { // do some }); // 已经是最新版 autoUpdater.on('update-not-available', (e) => { // do some }); // 更新下载进度事件 autoUpdater.on('download-progress', (e) => { // do some 有进度信息 }); // 更新下载完成事件 autoUpdater.on('update-downloaded', (event, releaseNotes, releaseName, releaseDate, updateUrl, quitAndUpdate) => { // do some 会返回有版本等信息 });
触发 下载安装包:
try { // 每次触发下载更新包时,会在缓存目录里存下安装包和一个update-info.json; // 如果触发了下载而没安装时,下次再次触发下载,就会报错,所以这里在每次检查时清空一下安装包的缓存目录 const updateCacheDirPath = path.join(autoUpdater.downloadedUpdateHelper.cacheDir); fs.emptyDir(updateCacheDirPath); // require('fs-extra') autoUpdater.downloadUpdate().then(() => { // 下载成功回调 }).catch(e => // 下载失败回调 ) } catch(e) { // do some }手动触发 重新启动安装软件
try { autoUpdater.quitAndInstall() } catch(e) { // do some }取消软件下载
autoUpdater.updateCancelled()
有以上的api就可以做一个自动更新程序了
注意:最好不要再配置文件里配置软件安装包的服务地址,
// 新增版本信息latest.yml,便于自动更新 publish: [ { provider: 'generic', url: '' // 更新包地址 不建议在这里填写 在主进程通过api填写 } ],
做的过程中走了不少弯路,主要electron-builder和electron-updater版本引起的
在本地遇到过:找不到dev-app-aupdater.yml、provider,主要是版本不一致,设置的软件安装包服务地址没生效引起的
最后执行安装时,本地环境是不能成功执行的,必须是打包环境才能安装,如果在开发环境做到了安装这一步,就可以打包测试了;
说下我做的大致流程:
检测到有新版本更新,触发下载;读取到进度条;下载完成后,手动触发安装;
-