• electronupdater更新程序接入


    -

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

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

    说下我做的大致流程:

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

    -

  • 相关阅读:
    Python字符串
    ListCtrl控件
    leetcode1004
    leetcode1003
    leetcode1002
    leetcode153
    leetcode540
    leetcode435
    leetcode999
    leetcode997
  • 原文地址:https://www.cnblogs.com/fqh123/p/15819656.html
Copyright © 2020-2023  润新知