如何做好软件自动更新

这里说的是C/S客户端更新,其他情况不做讨论

  • 1.更新程序减少依赖

之前做过一次更相信需要更新Newtonsoft.Json.dll 的版本

但是我的更新程序引用了这个文件 也就是说执行更新程序的时候这个文件是占用状态,更新不了!

所以更新程序最好是零引用,只用系统自带的dll类库就可以,尽可能【小】

  • 2.更新的脚本

软件更新有时候需要对系统设置进行一些更改,例如注册表,防火墙之类的,这个时候就需要执行一些脚本来写入注册表或开启防火墙端口

这里可以设定一个执行脚本,需要注意的是和更新程序一样,脚本的引用支持程序要简单,你不能为了执行脚本就要用户装一个脚本解析器。

额外说一句虽然vbs脚本系统默认都是认的,但是我也有遇到过【没有找到文件扩展VBS的脚本引擎】这样的错误,虽然可以修复这个错误但是也需要尽可能避免这个问题,用户不会在乎错误原因是什么,只会认为:“我用了你的系统报了一个错误”

  • 3.容灾

更新不一定能够绝对成功的,就是你的代码再完美,用户操作可能不合法,可能被杀软拦截,可能操作系统本身就有问题,等等意外,这个时候首先尽可能保证更新失败也可以正常使用系统,如果旧版本确实放弃了,无法使用,可以给出友好提示,联系管理员之类的。

  • 4.方案

这里记录一下我正在使用的方案,有不少不足之处,先记下来,后面优化

首先服务器上放一个txt文件,更新时读取这个txt文件

txt里面包含软件最新版本,软件每个需要用到的文件的版本,用于比较最新版本然后下载有更新的文件

扫描二维码关注公众号,回复: 7098972 查看本文章

为了生成这样的txt文件我还写了一个生成的小工具

然后时vbs脚本放在服务器端,更新时下载到客户端执行(如上文描述,有部分客户端操作系统提示错误【没有找到文件扩展VBS的脚本引擎】,后面准备用bat或exe)

vbs里面是一个延时执行的代码,比如【更新程序】时a.exe 如果要更新【更新程序】本身则将新版本的【更新程序】重命名为a2.exe放在服务端,然后下载到客户端,因为延时程序设定在a.exe退出后删除a.exe然后将a2.exe重命名为a.exe,以实现更新自身

同时vbs里面也有删除函数,用来清除多余的文件

容灾方案正在设计中……

设想:将旧版本重命名,追加【.old】,然后将新版本文件下载追加【.new】,所有下载完成之后再统一删除重命名,如果出错则把【.old】恢复

还没有实践,因为加了这个功能本质上违反了【简单】的原则,功能越多越容易发生问题,先将方案实现看看效果

猜你喜欢

转载自www.cnblogs.com/myrapid/p/11410722.html
今日推荐