技术标签: 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信息,并与渲染进程通信,下载进度发送到渲染进程,渲染进程展示
文章浏览阅读8.1k次,点赞8次,收藏32次。目录1、参数与超参数概念1.什么是参数2.什么是超参数2、二者有什么区别1.得到方式不同2.影响因素不同3.可控程度不同说在前面的话有些概念其实,很纠结,它到底是属于机器学习呢,还是属于深度学习呢?比如说,分类与回归,这个有些是很难界定的,有人说,它属于深度学习,又有人说,它属于机器学习。其实争论这些,好像并无太大意义,就像一个男生对一个姑娘宠溺的说:这天下..._parameters参数
文章浏览阅读333次。今天一个服务器装了数据库后,本机可以登录了,但是其他机器登录就是提示 tns连接超时,不管是用tnsping ip还是tnsping sid命令,都是提示TNS-12535: TNS: 操作超时。原因:一定要把xp系统自身的防火墙关闭,而不是一些杀毒软件的防火墙关闭。 ..._linux tnsping timeout 12535
文章浏览阅读619次。blocking and unblocking mechanism for linux drivern code概念: 1> 阻塞操作 是指在执行设备操作时,若不能获得资源,则挂起进程直到满足操作条件后再进行操作.被挂起的进程进入休眠,被从调度器移走,直到条件满足: 2> 非阻塞操作 在 ...学习笔记:java线程安全首先得明白什么是线程安全: 线程安全是编程中的术语,指..._linux下无法启动qtcreator
文章浏览阅读604次。我在空闲时间做一个应该是非常基本的操作系统。但是,我试图创建它以便您可以拥有任意多个用户,但是每次我创建一个新用户时,它都会删除旧用户。到目前为止,我有这个:def typer():print("Start typing to get started. Unfortunately, you cannot currently save your files.")typerCMD = input(" ..._txt存文件之前的留下来
文章浏览阅读60次。我可以向您提供关于使用遗传算法解决旅行商问题的一些指导。首先,需要确定旅行商问题的地图数据,然后编写代码,创建一个遗传算法,然后对算法进行调优,以获得最佳路线。最后,将结果显示在地图上,以便查看最终路线。...
文章浏览阅读1.3w次,点赞21次,收藏85次。一,游戏服务器开发的工作介绍近来遇到有很多人想从其它开发领域转到游戏服务器开发行业上来,他们或许觉得游戏服务器开发工资高,或许觉得做游戏服务器需要掌握的技术更高级,可以锻炼自己,或许觉得想换个环境等等。不管出于什么原因吧,做为一名几年的游戏服务器开发者,当然是持欢迎态度的,那么我就先介绍一下游戏服务器开发的工作吧,游戏服务器开发具体要做哪些工作呢?1,团队沟通基本上不管做什么开发,都是一个团队来完..._java游戏服务器开发用到数据库吗
文章浏览阅读6.1k次,点赞6次,收藏16次。以下描述了如何在Centos服务器上安装GPU版本的lammps。安装环境目标属性系统Linux/CentOS 7.6CPU12*Intel Xeon CPU E5-2609 v3 @ 1.90GHzGPU2*NVIDIA Tesla K80/CUDA 8.0安装准备1. CUDA由于是安装GPU版本lammps,首先应确保系统安装有显卡所对..._centos lammps gpu
文章浏览阅读2.9k次,点赞4次,收藏32次。目录什么是API?什么是API测试API测试的测试用例:API测试方法:如何进行API测试API测试的最佳做法:API测试检测到的错误类型API测试工具API测试的挑战结论:最后什么是API?API(全称Application Programming Interface)是两个单独的软件系统之间的通信和数据交换。实现API的软件系统包含可以由另一个软件系统执行的功能/子例程。什么是API测试API测试是一种用于验证API(应用程序编程接口)的._能直接温hr是不是刷api的吗
文章浏览阅读915次,点赞2次,收藏7次。date: 2020-01-12 21:46:05文章目录控件ButtonTextViewEditTextImageViewProgressBarAlertDialogProgressDialog布局LenearLayoutandroid:layout_gravityandroid:layout_weightRelativeLayoutFrameLayout百分比布局其他自定义控件ListVie..._能(textview、edittext、button、progressbar、alertdialog、progressdialog、lis
文章浏览阅读1.2k次。【实例简介】【实例截图】【核心代码】CONTENTS1 开胃菜 22 使用 Python 解释器 42.1 调用 Python 解释器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.2 解释器及其环境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . ...._python_3.4_入门指南(官方中文版).pdf
文章浏览阅读1.2k次。杰克逊注释@JsonProperty上使用期间的属性或方法的序列或反串行化的JSON。它带有一个可选的' name '参数,当属性名称与JSON中的' key '名称不同时,该参数很有用。默认情况下,如果键名称与属性名称匹配,则将值映射到属性值。在下面的示例中,我们可以使用@JsonProperty注解更改JSON中的字段名称。示例importjava.io.IOException;import...
文章浏览阅读3.5k次。转载请注明:http://blog.csdn.net/yanxiangyfg android代码团队开发中,为了团队合作我们需要建立代码仓库,以便进行团队间的协作. android最常用的代码管理工具是git, 那么团队间合作各自需要合入特性,这样就需要一个地方来存放代码,一般又三种方法:1>在github上进行托管2>建立本地代码库,团队所以代码都提交这个本地仓_android repo批量创建gerrit仓库