electron-updater更新程序接入

-

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,主要是版本不一致,设置的软件安装包服务地址没生效引起的

最后执行安装时,本地环境是不能成功执行的,必须是打包环境才能安装,如果在开发环境做到了安装这一步,就可以打包测试了;

说下我做的大致流程:

检测到有新版本更新,触发下载;读取到进度条;下载完成后,手动触发安装;

 

 

 

 

 

-

上一篇:arm裸机通过uboot运行hello world程序测试结果


下一篇:开源一套基于Spring Boot+Layui的内容管理系统/快速开发脚手架(含完整的开发文档)