Electron-vue项目在线更新功能

前言

在项目中客户给我们提出了需要在线更新的功能,意思就是要在程序启动时,自动检测是否需要更新,如果线上有新的包就自动下载、自动安装并且自动运行。
查了很多文档,我们决定采用electron-updater插件,这是一个基于electron的插件。

1.安装electron-updater

npm install electron-updater --save

2.在package.json或vue.config.js里添加public配置,打包将会在dist目录中生成latest.yml文件

注意: 有的electron项目是基于vue配置的,electron-vue项目就在vue.config.js里添加public,electron项目就在package.json里添加
package.json⬇:

"build": {
  "win": {
    "icon": "logo.ico",
    "target": [
      { 
         "target": "nsis",
         "arch": [
           "x64",
           "ia32"
         ]
      }
    ]
},
  "publish": [
    {
      "provider": "generic",
      "url": "http://183.95.190.36:9000/version/exam"
    }
  ]
}

vue.config.js⬇:(因为没有采用electron-vue,这是从网上找到的资源)


image.png

3.在主进程添加updater配置

这里主进程很好理解,在程序run起来时,对程序做的一些配置信息(比如窗口大小,是否置顶等等);
在我们的项目中主进程就是main.js⬇:

//自动更新
//执行自动更新检查
function updateHandle() {
  // const feedUrl = 'file:///D:/project/exam/jr-zjt-exam-electron/build/'; //本地更新包的位置
  const feedUrl = 'http://183.95.190.36:9000/version/exam'; //线上更新包的位置
  autoUpdater.setFeedURL(feedUrl);

  let message = {
    error: '检查更新出错1',
    checking: '正在检查更新1......',
    updateAva: '检测到新版本,正在下载1......',
    updateNotAva: '现在使用的就是最新版本,不用更新1',
  };
  autoUpdater.on('error',function (error) {
    console.log(error)
    sendUpdateMessage(message.error)
  })
  autoUpdater.on('checking-for-update',function () {
    console.log('检查更新')
    sendUpdateMessage(message.checking)
  })
  autoUpdater.on('update-available',function (info) {
    console.log(info)
    sendUpdateMessage(message.updateAva)
    win.webContents.send('isUpdateNow')
  })
  autoUpdater.on('update-not-available',function () {
    console.log(message.updateNotAva)
    sendUpdateMessage(message.updateNotAva)
  })
//更新下载进度事件
  autoUpdater.on('download-progress',function (progressObj) {
    console.log(progressObj)
    sendUpdateMessage(progressObj)
    win.webContents.send('downloadProgress',progressObj)
    win.setProgressBar(progressObj.percent / 100)
  })
  autoUpdater.on('update-downloaded',function (event,releaseNotes,releaseName,releaseDate,updateUrl,quitAndUpdate) {
    console.log('更新完成')
    sendUpdateMessage('正在下载..........')
    ipcMain.on('isUpdateNow',(event,arg)=>{
      console.log('开始更新');
      sendUpdateMessage('开始更新')
      autoUpdater.quitAndInstall()
    })
    win.webContents.send('isUpdateNow')
  })
  ipcMain.on('checkForUpdate',()=>{
    //执行自动更新检查
    console.log("执行自动更新检查")
    autoUpdater.checkForUpdates();
  })
  function sendUpdateMessage(text) {
    win.webContents.send('message',text)
  }
}

这里有个要特别注意的: 我们要把这个检查更新的方法放在electron项目初始化的时候让它跑起来⬇


image.png

4.渲染进程添加代码配置index.html或app.vue

渲染进程根据不同项目也会有两种情况,vue项目的就进app.vue;
index.html⬇:

methods:{
    checkUpdateVersion() {
        const _this = this;
        //这个ipcRender从哪里来呢
        //我们可以在main.js主进程中拿到,const ipcRenderer = require('electron').ipcRenderer;
        //在这里我们就可以直接调用
        ipcRenderer.send("checkForUpdate");
        ipcRenderer.on("downloadProgress", (event, progressObj) => {
          console.log(progressObj);
          _this.percent = progressObj.percent || 0;
          if (_this.percent == 100){
            this.$message({
              message: '客户端下载完成,重启客户端即可完成更新!',
              type: 'success',
              duration: 0,
              showClose:true
            });
          }
        });
        ipcRenderer.on('message', (event, data) => {
          console.log("update data" + JSON.stringify(data));
          switch (data.type) {
            case 1:
              console.log("检查更新出错");
              break;
            case 2:
              console.log("正在检查更新……");
              break;
            case 3:
              this.isNew = false;
              this.$message({
                message: '检测到新版本,正在下载更新!',
                type: 'success',
                duration: 0,
                showClose:true,
                onClose:function (){
                  //this.updateNow();
                }
              });

              console.log("检测到新版本,……");
              break;
            case 4:
              console.log("现在使用的就是最新版本,不用更新");
              break;
          }
        });
      },
},
mounted(){
    this.checkUpdateVersion();
}

app.vue⬇:


image.png

5.执行打包方法

npm run dist/build  //这里打包方法根据你自己的pack.json配置来

打包完成后,我们可以看到打包后的build文件夹内⬇:


image.png

我们运行64位操作系统内的测试程序,就能看到正在检测更新,有更新会自动更新

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容