-
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,主要是版本不一致,設置的軟件安裝包服務地址沒生效引起的
最后執行安裝時,本地環境是不能成功執行的,必須是打包環境才能安裝,如果在開發環境做到了安裝這一步,就可以打包測試了;
說下我做的大致流程:
檢測到有新版本更新,觸發下載;讀取到進度條;下載完成后,手動觸發安裝;
-