electron自动更新

最终效果

在开始之前, 先让我们看一下最终效果: 在打开软件的时候, 会自动判断当前是否为最新版(和文件服务器上的最新版本进行对比), 如果不是最新版, 则会自动下载安装并打开新版

自动更新过程.gif



在看过最终自动检测更新的效果之后, 让我们从头开始配置

初始化vue-cli3项目

vue-cli3初始化项目已经去掉了vue.config.js, 这里需要自己新增文件进行配置

安装与配置electron-updater

//安装
npm install electron-updater --save
  • 安装好后, 会在package.json中生成一些script脚本, 另外electron-builder的配置项需要写在vue.config.js中, 因为vue-cli3.0已不再支持package.json中配置config和build, 否则会报下述错误*
error: 'build' in the application package.json is not supported since 3.0 anymore

打开vue.config.js

pluginOptions:{
    ...
    electronBuilder: {
      nodeIntegration: true,
      contextIsolation: false,
      builderOptions: {
        productName: "vue-config-package",
        appId: "123",
        //注意, 只有在配置了publish路径时, build之后才会生成latest.yml文件
        publish: [
          {
            "provider": "generic",
            "url": "http://127.0.0.1:8000/"
          }
        ]
      }
    }
}

搭建文件服务器

在本地搭建文件服务器, 用于存放最新的安装包和latest.yml文件

  • latest.yml文件是自动更新的重要依据, 里面记录了版本号, 安装exe路径, 打包release时间等
npm i -g simplehttpserver
//进入根目录, 执行下列代码
simplehttpserver
//默认8000端口, 也可以自定义端口:  simplehttpserver -p 8080



前期准备和安装工作已经完成, 接下来要编写update.js脚本(主进程), 以及渲染页面中的监听和后续操作

主进程update.js

在background.js同级目录新增update.js, 用于封装主进程的electron-update的事件回调

import {
    autoUpdater
} from 'electron-updater'
 
import {
    ipcMain
} from 'electron'
let mainWindow = null;
export function updateHandle(window, feedUrl) {
    debugger
    mainWindow = window;
    let message = {
        error: '检查更新出错',
        checking: '正在检查更新……',
        updateAva: '检测到新版本,正在下载……',
        updateNotAva: '现在使用的就是最新版本,不用更新',
    };
    //设置更新包的地址
    autoUpdater.setFeedURL(feedUrl);
    //监听升级失败事件
    autoUpdater.on('error', function (error) {
        sendUpdateMessage({
            cmd: 'error',
            message: error
        })
    });
    //监听开始检测更新事件
    autoUpdater.on('checking-for-update', function (message) {
        sendUpdateMessage({
            cmd: 'checking-for-update',
            message: message
        })
    });
    //监听发现可用更新事件
    autoUpdater.on('update-available', function (message) {
        sendUpdateMessage({
            cmd: 'update-available',
            message: message
        })
    });
    //监听没有可用更新事件
    autoUpdater.on('update-not-available', function (message) {
        sendUpdateMessage({
            cmd: 'update-not-available',
            message: message
        })
    });
 
    // 更新下载进度事件
    autoUpdater.on('download-progress', function (progressObj) {
        sendUpdateMessage({
            cmd: 'download-progress',
            message: progressObj
        })
    });
    //监听下载完成事件
    autoUpdater.on('update-downloaded', function (event, releaseNotes, releaseName, releaseDate, updateUrl) {
        sendUpdateMessage({
            cmd: 'update-downloaded',
            message: {
                releaseNotes,
                releaseName,
                releaseDate,
                updateUrl
            }
        })
        //退出并安装更新包
        autoUpdater.quitAndInstall();
    });
 
    //接收渲染进程消息,开始检查更新
    ipcMain.on("checkForUpdate", (e, arg) => {
        //执行自动更新检查
        // sendUpdateMessage({cmd:'checkForUpdate',message:arg})
        autoUpdater.checkForUpdates();
    })
}
//给渲染进程发送消息
function sendUpdateMessage(text) {
    mainWindow.webContents.send('message', text)
}

background.js中:

//自动更新脚本
import { updateHandle } from './update.js';

async function createWindow() {
  ...
  //这里是文件服务器的根路径地址
  let feedUrl = "http://127.0.0.1:8000/";
  updateHandle(win,feedUrl);
}

渲染进程

App.vue

<template>
  <div>
      <p>当前版本1.0</p>
      <p v-if="dialogVisible">正在更新新版本,请稍候...</p>
  </div>
</tempalte>
<script>
let ipcRenderer = require("electron").ipcRenderer;
let _this = this;

//接收主进程版本更新消息
ipcRenderer.on("message", (event, arg) => {
  // for (var i = 0; i < arg.length; i++) {
  console.log('Appvue:',arg);
  if ("update-available" == arg.cmd) {
    //显示升级对话框
    _this.dialogVisible = true;
  } else if ("download-progress" == arg.cmd) {
    //更新升级进度
    console.log(arg.message.percent);
    let percent = Math.round(parseFloat(arg.message.percent));
    _this.percentage = percent;
  } else if ("error" == arg.cmd) {
    _this.dialogVisible = false;
    alert("更新失败");
  }
  // }
});
//2秒后开始检测新版本
let timeOut = window.setTimeout(() => {
  ipcRenderer.send("checkForUpdate");
}, 2000);
clearTimeout;
//间隔1分钟检测一次
let interval = window.setInterval(() => {
  ipcRenderer.send("checkForUpdate");
}, 60000);

export default {
  data(){
    return{
      dialogVisible: false,
      closeOnClickModal: false,
      closeOnPressEscape: false,
      showClose: false,
      percentage: 0,
      strokeWidth:200
    }
  },
  mounted(){
    _this = this;
  },
  methods:{
    ipcRenderer(keyword){
      this.$electron.ipcRenderer.send(keyword,"123");
    },
  },
  destroyed() {
    window.clearInterval(interval);
    window.clearInterval(timeOut);
  }
}
</script>

测试步骤

  1. 更改package.json中的version和App.vue中任意内容(例如当前版本X.X可以看出当前版本效果特性的内容)
  2. 将最新的安装包放到simplehttpserver运行的本地文件服务根目录中
  3. 安装运行旧版本的包, 则会进入并且自动更新下载打开新的资源包





参考文档
1.electron官方文档:https://www.electronjs.org/docs/tutorial/quick-start
2.electron-builder官方文档:https://www.electron.build/api/electron-builder
3.electron-builder常用配置中文注释https://blog.csdn.net/sw7662504/article/details/109241935?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-8&spm=1001.2101.3001.4242
4.vue-cli2.0+electron配置教程https://blog.csdn.net/gsj4719896/article/details/100131840

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

推荐阅读更多精彩内容