electron重启后更新_Electron~增量更新和全量更新-程序员宅基地

技术标签: electron重启后更新  

增量更新说明文档

增量更新指的是本地发布前通过打包生成dist,压缩成app.zip包,上传到服务器;客户端每次重启执行一次检测更新,比较本地与远程json的版本,如果有最新版本,则获取zip包并解压覆盖到本地,重启app完成更新;

提前准备

准备本地或者远程服务器或者远程静态文件url

npm i -g http-server

cd yourFileFolder // 进入任意文件夹

http-server -p 4000 // 快速开启本地服务,用于存储更新文件

配置和打包,拿到更新文件内容并压缩

// package.json

// 关闭asar模式

"asar": false,

// 打包

npm run pack-windows

// 进入打好的windows包

cd release\0.x.x_setup\win-unpacked\resources

// 压缩app文件夹 => app.zip, 拷贝app-update.yml和app.zip

app.zip app-update.yml 传到服务器

本地流程,启动客户端,点击增量更新

// 入口

// src\render\components\AutoUpdate\index.tsx

checkForPartUpdates()} style={ { marginLeft: 10 }}>

增量更新

// 本地检查与服务器的version版本比较

// 如果找到新版本,则向主进程通信,通知checkForPartUpdates开始更新

// src\render\utils\autoUpdate\partUpdate.js

/** 检查更新 */

export async function checkForPartUpdates() {

try {

// check version 检查版本

const res = await checkVersion()

if (res && res === 'OPEN_PART_UPDATE') {

// 增量更新

console.log('OPEN_PART_UPDATE')

confirm({

title: '检测到更新',

icon: ,

content: (

是否更新?

),

okText: '确认',

cancelText: '取消',

onOk() {

ipc && ipc.send('checkForPartUpdates')

message.info('请耐心等待几秒..')

},

onCancel() {

console.log('Cancel');

},

});

// partUpdates()

}

if (res && res === 'OPEN_ALL_UPDATE') {

console.log('OPEN_ALL_UPDATE')

// 全量更新

}

} catch (error) {

console.error('checkVersionERROR', error)

}

}

function checkVersion(params) {

return new Promise((resolve, reject) => {

const currentVersion = remote.app.getVersion()

// 获取最新版本号

downloadFile(remoteYmlURL, localYmlUrl).then(res => {

const remoteVersion = JSON.stringify(res.data).split('\\n')[0].split(' ')[1]

const remoteVersionArr = remoteVersion.split('.')

const currentVersionArr = currentVersion.split('.')

// 0.1.1 Y和Z比较来开启增量更新 1.1.1 X比较来开启全量更新

if (Number(remoteVersionArr[0]) > Number(currentVersionArr[0])) {

// 开启全量更新

return resolve('OPEN_ALL_UPDATE')

} else if (Number(remoteVersionArr[2]) > Number(currentVersionArr[2]) || Number(remoteVersionArr[1]) > Number(currentVersionArr[1])) {

// 开启增量更新

return resolve('OPEN_PART_UPDATE')

} else {

console.log('无版本变动,不更新')

}

}).catch(e => {

console.error(e)

})

})

}

// src\main\controls\AppAutoUpdater.js

// 下载服务器文件包

// 本地解压和备份,替换,重启客户端即可完成更新

// 增量更新

ipcMain.on('checkForPartUpdates', async (e, msg) => {

console.log('checkForPartUpdates', msg)

// if (isElectronDev) {

// console.log('开发模式不支持')

// return

// }

try {

if (fs.existsSync(`${localresourcePath}.back`)) { // 删除旧备份

deleteDirSync(`${localresourcePath}.back`)

}

if (fs.existsSync(localresourcePath)) {

fs.renameSync(localresourcePath, `${localresourcePath}.back`); // 备份目录

}

await downloadFile(remoteAppURL, appZipPath)

console.log('app.asar.unpacked.zip 下载完成')

fs.mkdirSync(localresourcePath) // 创建app来解压用

try {

// 同步解压缩

const unzip = new AdmZip(appZipPath)

unzip.extractAllTo(resourcePath, true)

console.log('app.asar.unpacked.zip 解压缩完成')

console.log('更新完成,正在重启...')

mainWindow.webContents.send('partUpdateReady')

setTimeout(() => {

app.relaunch(); // 重启

app.exit(0);

}, 1800);

} catch (error) {

console.error(`extractAllToERROR: ${error}`);

}

// 更新窗口

// BrowserWindow.getAllWindows().forEach((win: any) => {

// win.webContents.reload()

// // remote.app.relaunch(); // 重启

// // remote.app.exit(0);

// })

console.log('webContents reload完成')

} catch (error) {

console.error(`checkForPartUpdatesERROR`, error)

if (fs.existsSync(`${localresourcePath}.back`)) {

fs.renameSync(`${localresourcePath}.back`, localresourcePath);

}

}

})

全量更新

全量更新指的是下载服务器最新包覆盖安装更新;

目前使用的三方库是electron-updater,主要api是checkForUpdatesAndNotify, autoUpdater类 监听下载进度,检查更新等,

app主进程接收updater信息,并与渲染进程通信,下载进度发送到渲染进程,渲染进程展示

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_35241774/article/details/112938137

智能推荐

JS对table添加删除一行_var row = btn.parentnode.parentnode; r-程序员宅基地

文章浏览阅读1k次。添加一行,并用AJAX提交数据。 function submitForm() { var name = $("#name").val(); var description = $("#description").val(); var url = $("#url").val(); $.ajax({ url: '/admin/ops', type:_var row = btn.parentnode.parentnode; row.parentnode.removechild(row);

HTML学习记录(列表标签&属性)_列表标签的属性-程序员宅基地

文章浏览阅读196次。ol:有序列表标签属性值描述type1,A,a,I,i规定列表顺序类型reversed (HTML5新加)reversed列表倒叙startnumberHTML5不支持,规定列表起始<ol type="A/a/I,i">ul:无序列表标签属性值描述typedisc,square,circle规定列表顺..._列表标签的属性

FFmpeg 编译支持的格式_ffmpeg g722-程序员宅基地

文章浏览阅读332次。[meng@localhost ffmpeg-4.3.2]$ ./configure --helpUsage: configure [options]Options: [defaults in brackets after descriptions]Help options: --help print this message --quiet Suppress showing informative output --_ffmpeg g722

Python GUI 快速入门_pygui-程序员宅基地

文章浏览阅读2.6k次,点赞4次,收藏22次。GUI 就是图形用户界面的意思,在 Python 中使用 PyQt 可以快速搭建自己的应用,使得自己的程序看上去更加高大上,学会 GUI 编程可以使得自己的软件有可视化的结果,更方便地参加 “互联网+”或其他创新创业大赛。目 录1 安装PyQt 与QtDesigner2 添加GUI 到 PyCharm3 界面设计测试小程序1 安装PyQt 与QtDesigner如果你想用 Python 快速制作界面,可以安装 PyQt:pip install pyQt5 -ih..._pygui

以吃货联盟初级改版为例,(面向对象初级程序设计模拟网上点餐控制台程序(第一版未使用工具辅助类)。_吃货(多实例测试)-程序员宅基地

文章浏览阅读999次,点赞2次,收藏6次。面向对象最初级程序设计思维:设计过程与抽象过程,(类是对象的模板与抽象,是具有相同属性和方法的一组对象的集 合,对象是类的实体,由属性与行为共同组成一个具体的实体。) 类与对象的关系:类是对象抽象,对象是类的实例化实体。 使用类图理解类的关系 面向对象三大特性应用:1、封装 ;2、继承;3、多态;是程序设计更符合人思考的方式。 封装:{维护数据安全性将属性私有化(以包机制,与private..._吃货(多实例测试)

Camstar技术介绍-程序员宅基地

文章浏览阅读212次。Camstar_camstar

随便推点

Oracle中通过存储过程,Function,触发器实现解析时间类型的字段并插入的对应的数据表中...-程序员宅基地

文章浏览阅读71次。摘要:之前在项目中解决了插入字符串类型的数据,今天试着写了一个插入date类型的字段,成功了,现在记录一下,以便以后查看:一:首先建立一个根据xml节点名称获取对应的xml值的Function.sql:CREATE OR REPLACE FUNCTION MIP.GetXmlNodeValue (xmlStr CLOB, nodeName VARCHAR2) RETURN VAR..._oracle sql 触发器中对date类型的字段的处理

KCF -目标检测算法总结_kcf 目标检测-程序员宅基地

文章浏览阅读1.1w次,点赞7次,收藏48次。KCF简介KCF是一种鉴别式追踪方法,这类方法一般都是在追踪过程中训练一个目标检测器,使用目标检测器去检测下一帧预测位置是否是目标,然后再使用新检测结果去更新训练集进而更新目标检测器。而在训练目标检测器时一般选取目标区域为正样本,目标的周围区域为负样本,当然越靠近目标的区域为正样本的可能性越大。简单来说 KCF 是 核相关滤波算法,滤波器 和 跟踪patch 进行相乘的到相关性,对应位置较..._kcf 目标检测

汇编语言编一程序段,求双字(DX,AX)的绝对值_汇编语言求双字长数的绝对值-程序员宅基地

文章浏览阅读4.7k次。a100mov ax,ffff;把双字长数的低字放到AX中mov dx,ffff;把双字长数的高字放到DX中test dx,8000;测试双字长数的符号jz 0113;如果是非负数,则直接保存neg dx;如果是负数,则求补neg ax;求补sbb dx,0int 3g=073f:0100 0113运行附图如下:..._汇编语言求双字长数的绝对值

Qt安装MySQL驱动,解决QMYSQL driver not loaded问题_qsmqldriver-程序员宅基地

文章浏览阅读222次。根据项目https://github.com/thecodemonkey86/qt_mysql_driver翻译Get precompiled qsqlmysql.dll from releases获取编译后的qsqlmysql.dll 链接不是很懂这两个有什么区别之后put qsqlmysql.dll (if release build) / qsqlmysqld.dll (if debug build, but note that when using MinGW 8.1.0 the d_qsmqldriver

Java面试题目大汇总(附参考答案)-程序员宅基地

文章浏览阅读1.4w次,点赞61次,收藏333次。足足准备了长达3个月的面试,终于在上周拿到了阿里的offer!博主汇总整理了一份我面试之前看的一些Java面试题目,可以说是非常详细!分享给大家,希望对正在面试Java岗位的朋友有帮助哈~~(文末附参考答案)Java基础相关面试题目:JDK 和 JRE 有什么区别? == 和 equals 的区别是什么? 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗? final 在 java 中有什么作用? java 中的 Math.round(-1.5)

网络存储服务ip-san搭建_ipsan搭建-程序员宅基地

文章浏览阅读2k次。一.什么是ip-sanip-san也就是SAN(全称Storage Area Network,存储局域网络),它的诞生,使存储空间得到更加充分的利用,并使得安装和管理更加有效。SAN是一种将存储设备、连接设备和接口集成在一个高速网络中的技术。SAN本身就是一个存储网络,承担了数据存储任务,SAN网络与LAN业务网络相隔离,存储数据流不会占用业务网络带宽。在SAN网络中,所有的数据传输在高速、..._ipsan搭建

推荐文章

热门文章

相关标签