OAUS自動升級系統


     只要是以下載客戶端的形式分發的程序,絕大多數都需要自動升級的功能。目前主流的程序自動升級策略是,重新下載最新的安裝包,然后重新安裝整個客戶端。這種方式雖然簡單直觀,但是缺陷也很明顯。比如,即使整個客戶端有100M,而本次更新僅僅只是修改了一個1k大小的dll,那也意味着要重新下載100M的全部內容。這對帶寬是極大的浪費,而且延長了升級了時間,相應地也增加了客戶茫然等待的時間。

      在上述的場景中,自動升級時,我們能否只更新那個被修改了的1k的dll了?當然,使用OAUS自動升級系統可以輕松地做到這一點。OAUS自動升級系統可以對被分發的客戶端程序中的每個文件進行版本管理,每次升級的基礎單元不再是整個客戶端程序,而是其中的單個文件。針對單個文件的更新,包括三種形式:

(1)文件被修改。

(2)文件被刪除。

(3)新增加某個文件。

      OAUS對這三種形式的文件更新都是支持的。每次自動升級,都可以更改N個文件、刪除M個文件、新增加L個文件。

一.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便可以確定該文件在客戶端機器上的絕對路徑了。

二.OAUS自動升級流程 

      下面我們就詳細講講如何使用OAUS來構建自動升級系統,大概的步驟如下。

1.運行OAUS服務端。     

     

      服務端主界面將顯示所有正在自動升級的OAUS客戶端信息。

2.將被分發的客戶端程序的所有內容放到OAUS服務端的FileFolder文件夾下,其結構與客戶端程序正常部署后的結構要完全一致。我們以部署VideoChatSystem為例。 

       

3.使用OAUS服務端為被分發的客戶端程序的每個文件生成默認版本號,並創建版本信息配置文件UpdateConfiguration.xml。這個配置文件也將被客戶端使用。

      點擊服務端【工具】菜單欄下的【版本管理】子菜單,將彈出用於管理各個文件版本的【文件版本信息】窗體。         

     

      雙擊列表中的任意一行,可以修改其對應文件的版本的值(float類型的數值)。注意,此列表中的版本信息與文件的真實版本屬性(比如dll的版本屬性X.X.X.X)可以是沒有任何聯系的,列表中版本的值只是用於標記文件是否被修改,所以,文件每被修改一次,其列表中對應的版本的值就應該有所增大。

      當關閉【文件版本信息】窗體時,只要有某個文件版本變化,則“最后綜合版本”的值(int類型)會遞增1。通過比較OAUS的客戶端保存的“最后綜合版本”的值與OAUS的服務端最新的“最后綜合版本”的值,就可以快速地識別客戶端是否已經是最新版本了。

      另外,初次打開這個窗口時,將在OAUS服務端的目錄下,自動生成一個版本信息配置文件UpdateConfiguration.xml。而且,每當通過該窗體來設置某個文件的新版本時,UpdateConfiguration.xml會自動同步更新。

4.將UpdateConfiguration.xml添加到OAUS的客戶端程序(即上述的AutoUpdater的文件夾)中。

5.在創建被分發的客戶端的安裝程序時,將OAUS的客戶端(即AutoUpdater的文件夾)也打包進去,並且像前面說的一樣,要將其直接部署在運行目錄(BaseDirectory)下(與分發的exe同一目錄)。

      如此,准備工作就完成了,當客戶端通過安裝包安裝好了VideoChatSystem之后,其目錄結構像下面這樣: 

       

6.當我們有新的版本要發布時,比如要更新某個文件(因為文件被修改),那么可以這樣做:

(1)將修改后的文件拷貝到OAUS服務端的FileFolder文件夾下的正確位置(或覆蓋舊的文件)。

(2)在OAUS服務端打開【文件版本信息】窗體,雙擊被修改文件所對應的Row,在彈出的窗體上修改對應文件的版本號,將版本號的數值增加。(如果是刪除舊文件或添加新文件,此處也可進行相應的操作)

7.如此,當客戶端再啟動AutoUpdater.exe時,就會自動升級,更新那些發生變化的文件。 以下是AutoUpdater.exe運行起來后的截圖。

     

8.當升級完成后,將啟動前述的OAUS客戶端配置文件中配置的回調exe。(在本例中就是VideoChatSystem.exe)

9.OAUS客戶端會在日志文件UpdateLog.txt(位於AutoUpdater的文件夾下,在OAUS客戶端首次運行時自動生成該文件)中,記錄每次自動升級的情況。

三.何時啟動自動升級客戶端?

      假設某個系統是下載客戶端形式的,那么客戶端該如何知道是否有新版本了?然后又該何時啟動AutoUpdater.exe了?

      我們的經驗是這樣的:客戶端登錄成功之后,從服務器獲取“最后綜合版本”的值,然后與本地的“最后綜合版本”的值相比較,如果本地的值較小,則表示客戶端需要更新。這個過程可以這樣做到:

(1)當在OAUS服務端的FileFolder文件夾下放置了新的文件,並通過【文件版本信息】窗體正確的更新了版本號,在關閉【文件版本信息】窗體時,會彈出最新的最后綜合版本”的值。記錄這個值,並將其傳遞到系統自己的服務端的內存(比如,服務端提供一個輸入框將這個值輸入進去)。

(2)系統客戶端可以通過引用AutoUpdaterSystem.Core.dll,並調用VersionHelper的靜態方法GetCurrentVersion來獲取本地的“最后綜合版本”的值。

(3)系統客戶端在登錄成功后就可以從服務器獲取最新的“最后綜合版本”的值,來和本地的值進行比較了。

      比較之后,如果發現客戶端需要升級,則通常有兩種模式:由用戶選擇是否升級,或者是強制升級。

      一般而言,如果最新客戶端程序與老版本兼容,不升級也影響不大,則可以交由用戶決定是否升級;如果最新客戶端程序不兼容老版本,或者是有重大更新,則將啟動強制升級。如果流程要進入啟動升級,那么只要啟動AutoUpdater的文件夾下AutoUpdater.exe就可以了。要注意的是,啟動AutoUpdater.exe進程后,要退出當前的客戶端進程,否則,有些文件會因為無法被覆蓋而導致更新失敗。代碼大致如下所示: 

  int version = ...//從服務器獲取  
if (VersionHelper.GetCurrentVersion() < version)
{
string updateExePath = AppDomain.CurrentDomain.BaseDirectory + "AutoUpdater\\AutoUpdater.exe";
System.Diagnostics.Process myProcess = System.Diagnostics.Process.Start(updateExePath);
......//退出當前進程
}

 四.下載OAUS

      OAUS-Free

       

----------------------------------------------------------------------------------------------------------------------------------------------- 

關於ESFramework的任何問題,歡迎聯系我們:

電話:027-87638960

Q Q:168757008

 

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com