当前位置: 首页 > Web前端 > HTML

Electron增量更新(三)

时间:2023-03-28 15:45:42 HTML

自从写了Electron系列之后,很多同学问了一些问题,主要是针对Electron的增量更新。之前写过IncrementalUpdate(2),但是其他Windows方法需要管理员权限包,不是很优雅,而且如果要拖拽,由于权限问题,提权后的软件会禁止拖拽(将外部文件拖入软件窗口时会有禁止图标),那么本期我将对增量更新进行更详细的说明,并提供一个临时的升级更新方案供大家参考。Mac更新有同学问Mac平台下如何增量更新系统。其实Mac下Electron的asar文件是可以直接替换的,所以下载替换后,启动一个定时器,重启即可。Windows其实我们大部分的桌面软件是不需要管理员权限的(就是软件有屏蔽)。我们发现很多软件在需要更新的时候都会有一个弹窗。点击之后,会临时提权Update,本期的目标就是为增量更新实现这个临时提权功能。更新问题其实我们的增量更新有两个难点。要做到这一点,我们必须克服这两个主要问题:我们什么时候需要提升UAC权限?Electron应用启动后app.asar被占用锁定的问题如何处理?更新说明Windows系统具有不同的用户权限级别。比如我是普通用户,在修改C盘某些文件夹的文件时,会弹出让你使用管理员权限创建或修改等的窗口,当软件安装在c盘,我们需要管理员权限来替换app.asar文件。关于锁的问题,在增量2中已经解释过了,解决方法是关闭我们的Electron应用,然后替换app.asar文件。update步骤写一个bat脚本,在脚本中关闭Electron应用,替换app.asar文件,重启Electron应用,然后将bat脚本打包成exe文件。下载update.asar(更新版app.asar)判断用户软件是否安装在c盘,yes:使用sudo-prompt包临时提权执行上述exe,no:直接使用即可在不提升权限的情况下执行节点执行上述exe。更新准备模拟请求的前两个更新已经提到。增量更新(二)点这里查看步骤,这里就不多说了。buildexe@echoofftaskkill/f/im%3timeout/T1/NOBREAKdel/f/q/a%1\app.asarmove%2\update.asar%1ren%1\update.asarapp.asarexplorer.exe%4简单解释一下,%1和%2是运行脚本时传入的参数,比如update.bataaabbb,那么%1就是aaa,%2就是bbb,就是我们上面执行exe的时候传入的,也就是,%1是resourcesPath(也就是我们的app.asar所在的目录),%2是下载更新update.asar的目录,%3是软件的进程名(可以在任务中查看manager),%4是软件的启动exe。这里的逻辑是Electron应用暂停1秒,然后删除app.asar,将update.asar移动到app.asar目录下,重命名为app.asar,然后启动Electron应用。下载软件BatToExeConverter将update.bat转换为update.exe。详细操作请参考前两期的详细说明。对比上一期,我们发现启动时并没有使用start命令,而是使用了explorer.exe,这是Windows系统自带的程序管理器。这里的处理是打包好的Electron应用没有管理员权限,但是如果我们在提权后执行这个exe来启动Electron应用,我们会发现此时Electron应用也有管理员权限,所以我们需要使用explorer.exe以降低的权限启动它。sudo-promptinstallsudo-prompt,npmisudo-prompt,sudo-prompt这个包类似于node的exec命令,执行时会有提权弹窗,用户以管理员权限执行命令确认后,新建一个sudoPrompt.js:varsudo=require('sudo-prompt')varoptions={name:'Electron',}exportdefault(shell)=>{returnnewPromise((resolve,reject)=>{sudo.exec(shell,options,function(error,stdout,stderr){if(error){reject(error)console.log('error:'+error)return}resolve(stdout)console.log('stdout:'+stdout)})})}//npmihttps://github.com/xuxingeren/sudo-prompt"sudo-prompt":"git+https://github.com/xuxingeren/sudo-prompt.git",note:sudo-prompt这个包很久没有维护了,现在最新的还是有一些问题,主要是中文路径会有错误。原作者已经关闭,无法提pr。我这里已经处理过了。如果你使用它,你可以fork我的分支。构建、解决主进程更新处理、更新前准备和渲染进程处理这里略过,请看前两期内容importdownloadFilefrom'./downloadFile'importsudoPromptfrom'./sudoPrompt'import{app}from'electron'constfse=require('fs-extra')constpath=require('path')constAdmZip=require('adm-zip')importlogfrom'../config/log.js'exportdefaultasync(data)=>{constresourcesPath=process.resourcesPath//下载上面打包的updateexe,我是放在app.getPath('userData')下的,其他位置如果也可以(!fse.pathExistsSync(path.join(app.getPath('userData'),'./update.exe'))){awaitdownloadFile({url:data.upDateExe,targetPath:app.getPath('userData')}).catch((err)=>{console.log(err)log.info(err)})}//权限提升方案,constdownloads=app.getPath('downloads')//下载update.asar,在系统downloadFile({url:data.upDateUrl,targetPath:downloads}).then(async(filePath)=>{constzip=newAdmZip(filePath)zip.extractAllToAsync(downloads,true,(err)=>{if(err){console.error(err)return}fse.removeSync(filePath)//这里可以加判断,如果软件安装在c盘使用sudoPrompt提权,执行update.exe,如果没有,可以直接执行update.exe//暂时提权运行exe,关闭exe中的主进程,替换c盘中的asar(右边是处理c盘,如果安装了其他盘可以直接用node.exec运行exe替换)//由于提升后的exe打开electron,启动后也会有管理员权限,所以需要降权限启动,explorer.exesudoPrompt(`"${path.join(app.getPath('userData'),'./update.exe')}""${resourcesPath}"${downloads}"${process.env.VUE_APP_PRODUCTNAME}.exe""${app.getPath('exe')}"`)})}).catch((err)=>{log.info(err)console.log(err)})}手动调试可以在cmd中执行update.exexxxxxxxxxxxx传入对应的更新地址即可查看执行无论成功与否,这一系列的更新只能在周末和下班后整理。如果内容多了,更新会慢一些。希望对您有所帮助。请多多star或点赞收藏支持本文。地址:链接本文github地址:链接