前言
目前常见的中小型软件/开源软件的更新模式大致有以下几种:
- 指引用户前往站点下载安装包自行覆盖安装。用户体验不太好,感觉很麻烦。代表有DBeaver/VirtualBox等;
- 提醒用户执行更新,经过同意后,下载安装包并运行。用户体验稍微好了一些,代表有Bandizip/Notepad++等;
- 软件在后台自动下载安装包,适时提醒用户执行更新,经过同意后运行安装包。这样能够节省用户的等待时间,代表有PotPlayer/FileZilla等。
一个完善的软件应当有着合理的更新机制。为了让用户获得更好的体验,更新过程应当是简便的、无痛的;为了提高开发者本身的效率,更新模块应当是通用的,可以快速地扩展到不同的项目中去。
同时,我认为软件应当是「绿色」的,即尽可能不提权,不写注册表,删除目录即卸载,不留垃圾文件。注意到上述的几种更新模式都使用了安装包作为最终媒介,这并不符合我的需求,因此我需要另行设计。如果你的项目符合我对「绿色」的定义,那么可以接着向下阅读。
文末将附上本项目源码(.NET4.5以上)。
特点
使用简单
整个模块包含两个可执行文件Uploader与Updater。开发者方面,编写一个简单的配置文件并使用Uploader执行,就可以将新版本与相关信息上传到服务器(需要具有用FTP与HTTP访问服务器上文件的权限);客户端方面,只需引用Updater并调用一个方法,即可自动完成检查/通知/下载/安装更新的整个过程。
节省空间和流量
上传的内容经过压缩(可选),节省服务器空间。同时,客户端在更新时仅下载有变化的文件,相比下载整个安装包的做法更加节省服务器流量与用户的时间。
可完全自定义的更新内容展示
通过XAML代码向用户展示更新内容。不仅能做出漂亮的展示界面,还可以在其中添加图片和视频。
可对自身进行更新
更新程序在临时文件夹中运行,不占用项目根目录中任何一个文件。
流程
开发者:
- 编写配置文件(包含更新内容描述等);
- 用Uploader打开配置文件;
- 等待上传完毕。
客户端:
- 在项目中引用Updater;
- 客户端程序运行时,调用Updater的检查更新方法,将在后台下载并检验更新信息;
- 若有新版本,把新版本描述展示给用户;
- 用户同意更新后,将Updater复制到临时目录并启动;
- Updater将当前版本文件内容与新版本进行对比,仅下载有变化的文件,显示下载进度;
- 下载完成后将新文件覆盖到项目根目录,启动主程序并退出Updater,完成更新。
配置文件解析
以下是一个配置文件的例子:
//必需区段,指定服务器地址