如何设计并实现一个自动升级系统的源码?
摘要:对于PC桌面应用程序而言,自动升级功能往往是必不可少的。而自动升级可以作为一个独立的CS系统来开发,这样,就可以在不同的桌面应用中进行复用。基于ESFramework的文件传送功能,我实现了一个可直接复用的自动升级系统OAUS,现在将其分
(最新OAUS版本请参见:自动升级系统OAUS的设计与实现(续))
对于PC桌面应用程序而言,自动升级功能往往是必不可少的。而自动升级可以作为一个独立的C/S系统来开发,这样,就可以在不同的桌面应用中进行复用。基于ESFramework的文件传送功能,我实现了一个可直接复用的自动升级系统OAUS,现在将其分享给大家。这篇文章将着重介绍OAUS的相关背景、使用方法,至于详细的实现细节,大家可以直接下载源码研究。如果了解了OAUS的使用,源码的理解就非常容易了。如果需要直接部署使用自动升级系统,那么,可下载文末的可执行程序压缩包。
一.OAUS的主要功能
目前主流的程序自动升级策略是,重新下载最新的安装包,然后重新安装整个客户端。这种方式虽然简单直观,但是缺陷也很明显。比如,即使整个客户端有100M,而本次更新仅仅只是修改了一个1k大小的dll,那也意味着要重新下载100M的全部内容。这对带宽是极大的浪费,而且延长了升级了时间,相应地也增加了客户茫然等待的时间。
在上述的场景中,自动升级时,我们能否只更新那个被修改了的1k的dll了?当然,使用OAUS自动升级系统可以轻松地做到这一点。OAUS自动升级系统可以对被分发的客户端程序中的每个文件进行版本管理,每次升级的基础单元不再是整个客户端程序,而是其中的单个文件。针对单个文件的更新,包括三种形式:
(1)文件被修改。
(2)文件被删除。
(3)新增加某个文件。
OAUS对这三种形式的文件更新都是支持的。每次自动升级,都可以更改N个文件、删除M个文件、新增加L个文件。
二.OAUS的使用
1.OAUS的结构
OAUS提供了可直接执行的服务端程序和客户端程序:AutoUpdaterSystem.Server.exe 和 AutoUpdater.exe。OAUS服务端的目录结构如下所示:
OAUS的客户端与服务器之间通过TCP通信,可以在AutoUpdaterSystem.Server.exe.config配置文件中配置服务器通过哪个TCP端口提供自动升级服务。
FileFolder文件夹初始是空的,其用于部署被分发的程序的各个文件的最新版本。注意,其下的文件结构一定要与被分发的程序正常部署后的结构完全一致 -- 即相当于在FileFolder文件夹下部署一个被分发的程序。
OAUS客户端的目录结构如下:
可以在AutoUpdater.exe.config配置文件中配置OAUS服务器的IP、端口等信息,其内容如下所示:
<configuration>
<appSettings>
<!--服务器IP -->
<add key="ServerIP" value="127.0.0.1"/>
<!--服务器端口-->
<add key="ServerPort" value="4530"/>
<!--升级完成后,将被回调的可执行程序的名称-->
<add key="CallbackExeName" value="Demo.exe"/>
<!--主窗体的Title-->
<add key="Title" value="文件更新"/>
</appSettings>
</configuration>
请注意配置的CallbackExeName,其表示当升级完成之后,将被启动的分发程序的exe的名称。这个CallbackExeName配置的为什么是名称而不是路径了?这是因为使用和部署OAUS客户端时是有要求的:
(1)被分发的程序的可执行文件exe必须位于部署目录的根目录。
(2)OAUS的客户端(即整个AutoUpdater文件夹)也必须位于这个根目录。
如此,AutoUpdater就知道分发程序的exe相对自己的路径,如此就可以确定分发程序的exe的绝对路径,所以就可以在升级完成后启动目标exe了。另外,根据上述的两个约定,再结合前面讲到的服务端的FileFolder文件夹的结构约定,当服务端更新一个文件时,AutoUpdater便可以确定该文件在客户端机器上的绝对路径了。
2.OAUS自动升级流程
下面我们就详细讲讲如何使用OAUS来构建自动升级系统,大概的步骤如下。
(1)运行OAUS服务端。
服务端主界面将显示所有正在自动升级的OAUS客户端信息。
(2)将被分发的客户端程序的所有内容放到OAUS服务端的FileFolder文件夹下,其结构与客户端程序正常部署后的结构要完全一致。
