最近的一个预开发任务,需要实现Electron APP 的更新策略
这里有两种更新,
首先说下全量更新,
检测到新版本后从服务器拉取 electron-builder生成的APP.zip文件,解压后,把*.app/*.exe 覆盖现有文件后重启(Mac端)/重新安装(PC端)。
这种更新的文件比较大,相当于删掉旧的,重新下载新APP后运行,对于小更新如文案,图片修改,并不友好。
electron builder 提供了这种更新方式,叫electron-updater
官方文档如下:https://www.electron.build/auto-update
该文档介绍的不够详细,使用中有很多问题都是参考github上的issue解决的
这里记录1个问题,花了我2天多时间才搞定。
就是在执行"appUpdater.downloadUpdate()"方法时, 并没有触发 "download-process" 事件,
这样就没法在页面上显示下载的进度条,网速等信息。最后通过网上下载某个更新示例才得到启发,
原来需要在下载之前,使用fs-extra.emptyDir清空缓存中的上次下载的更新文件,这样"download-process"事件就可以完美触发了
我的操作是在每次开启App的时候清空这个缓存路径
Mac/PC一套代码就可搞定,还是很方便的
官网文档根本就没有提到过这个删除缓存的操作
其次一个问题,产品的需求,要求下载过程中有"取消下载"的操作,
文档中也没有详细说明,只有一个cancellationToken.
这个很快就找到了答案:https://github.com/electron-userland/electron-builder/issues/1150
需要说明的是,取消下载后,再次点击下载,需要重新实例化 cancellationToken这个变量
----------------------------------------------------------------------
另一个是增量更新,
也叫热更新,检测到新版本后,从服务器拉取新版本指定的更新文件(如图片,模版页面,静态html等),
在自己的服务器添加一个json文件,指定热更新版本,热更新所需的文件列表以及更新描述,
下载文件后替换到APP对应的文件中,然后重新载入/刷新APP。
这种方式适合小更新,但不试用后台逻辑大调整等较多的逻辑修改。
在开发过程中遇到了一个问题
如果打包时设置asar: false,在运行主进程时是可以进行文件操作, 并替换成功的。之后relaunch app就可以。
但是当设置asar: true是,运行主进程里的文件操作命令,是无法写入修改asar里的文件的,
这个问题卡了我一天多,
最后终于找到了解决方法:这种方式需要将打包的静态文件剥离出来,
在asar: true的情况下,要使用asar.unpack 设置未来更新时可能需要的替换文件。
建议不要暴露主进程文件,只把图片,前端页面放入asar.unpack.
如图:
这样打包后的app里就会多一个app.asar.unpacked
主进程文件放在asar里,但是在运行下文件修改命令时,修改的是asar.unpacked里的文件,这样就可以替换成功了。
问题得到了解决,
下一步就是设置文件循环替换的promise逻辑和更新进度条。
或者下载一个包。解压后替换。