Wix安裝包製作-個人總結
總體講,使用Wix製作msi安裝包,很類似於使用VC寫可執行程式,不同的就是使用的語言和語法不同,編譯器和聯結器不同,但是思路還是相通的。
使用Wix寫的源程式是.wxs格式的,這種格式使用文字編輯器就可以編輯,寫好後使用candle.exe就可以編譯,其中Wix提供的candle.exe就是起編譯器的作用,執行cmd,引導到wix的目錄下,然後執行candle example.wxs就完成了原始檔的編輯工作。在本目錄下生成對應的.wixobj格式檔案,接著可以使用起聯結器作用的light.exe完成連線工作,執行light example.wixobj就生成了msi格式的對應安裝包example.msi。
Wix包還包括了其他幾個實用的工具,dark.exe就是其中一個比較常用的,它的作用是反編譯,可以將別人做好的msi格式安裝包反編譯成xml格式的文字檔案,這樣初學者就可以通過檢視別人寫的程式更好地學習安裝包的製作。另外一個常用的工具是tallow.exe,用於建立Wix源xml,以複製它在安裝目錄或檔案中的檔案或資料夾,避免大量的手動輸入,既方便又不容易出錯,但它有一個缺陷,不能自動生出Guid號,所以推薦去下載它的增強工具mallow.exe。
上面這些主要是對使用Wix製作msi安裝包巨集觀上的理解,剩下的就是微觀實現技術上的細節了,也就是可是使用語言,遵照語法寫程式了。Wix有自己的編寫格式和語法,但與C或C++相比,就顯得太簡單了,甚至不需要自己定義變數,非常容易上手,更類似於遵照html語法編寫網頁程式。至於Wix的語法,變數及其屬性等細節問題可以自習檢視wix help下的wix schama。
下面為logAduitAgent安裝包的實現過程:
1、首先講需要打包安裝的檔案,放在一個指定的目錄下,如放在E:/log下,將Wix包內容放在一個指定的目錄下,如E:/wix下;
2、使用mallow.exe將需要安裝的檔案目錄結構整理到wxs檔案中,即在cmd中執行
E:/wix>mallow -nologo -d E:/log > E:/log/filesmenu.wxs
3、為後面編譯除錯方便,將Wix包內容copy到E:/log下,這是不用擔心造成混亂,上面得到了整理好的目錄結構,如果後面需要增刪安裝時所需檔案,在wxs原始檔中適量改寫就好;
4、選擇一種適合的安裝介面,即選擇<UI></UI>結構之間的內容,對安裝介面部分盡興控制,這部分可以通過反編譯其他人制作好的成品msi安裝包而得到,對於其中不滿意的地方在動手修改,可以大大提高效率;
5、將filesmenu.wxs下的目錄結構從<Fragment>結構中copy出來,放到<Product>結構下,並與<UI></UI>之間的介面控制放在一起,命名為logAuditAgent.wxs;
6、為了能在安裝時,將程式所需要的檔案copy到指定的目錄下,要在<UI>之前加入<Feature>結構,其中引入所需要的元件資訊<ComponentRef Id="component0" />等,其中需要copy的檔案都放在Component下:
<Directory Id="INSTALLDIR" Name="logAudit" longName="logAuditAgent">
<Component Id="component0" Guid="XXXXXXXXXX" ......>
<File Id="file1" Name="name1" ......../>
<File Id="file2" Name="name2" ......../>
.............
</Component>
................
<Component Id="componentX" Guid="XXXXXXXXXX" ......>
<File Id="fileX1" Name="nameX1" ......../>
<File Id="fileX2" Name="nameX2" ......../>
.............
</Component>
</Directory>
當需要複製某些檔案到安裝目錄時,只需要在<Feature>結構中引入含有改檔案的Component即可:
<Feature>
<ComponentRef Id="component0" />
..................
<ComponentRef Id="componentX" />
</Feature>
7、為了使logAuditAgent程式安裝後立即執行,將其做成自動啟動的服務,在wxs原始檔中加入<ServiceInstall>和<ServiceControl>結構。其中<ServiceInstall>結構用來安裝服務,設定使用者名稱,服務描述等,<ServiceInstall>結構下的子結構<ServiceDependency>則用來設定本服務所依賴的已有服務:
<ServiceInstall Id="" Name="" DisplayName="" Type="ownProcee" Start="auto" .......>
<ServiceDependency Id="winmgmt" />
</ServiceInstall>
而<ServiceControl>結構則用來控制服務的安裝與解除安裝:
<ServiceControl Id="ServerCtr" Name="logAuditAgent" Start="install" Stop="uninstall" Remove="uninstall" Wait="yes" />表示logAuditAgent服務在安裝時就啟動,在解除安裝時關閉,並從服務表中刪除。
要想使服務在安裝是起作用,也需要講其放入某個Component下,並在<Feature>結構中用<ComponentRef>引入。此時還存在一個問題,就是安裝程式如何知道啟動服務時要執行哪個程式,本例是通過logAuditAgent.exe來啟動服務的,這是可以通過講<File Id="logAudit" Name="logAuditAgent" longName="logAuditAgent.exe" src="logAuditAgent.exe" />放在本Component的第一位置使安裝程式識別,如果不想受此限制,也可以在需要執行的那個檔案屬性中加入KeyPath="yes",強制設定本Component的主路徑。
8、為了使程式解除安裝時消除程序被kill是的延遲,引入<CustomAction>呼叫VBscript指令碼做時間等待,此時引入<CustomAction>結構設定使用者自定義行為,並在<InstallExecuteSequence>結構中引入<Custom Action>安排該行為的執行時機。
如本例中:
先設定定義使用者行為:
<CumtomAction Id="test.bat" Return="asynvNowait" FileKey="" ExeCommand="" />
接著安排自定義行為的執行時機:
<InstallExecuteSequence>
<Custom Action="test.bat" Before="RemoveFiles" />
</InstallExecuteSequence>
9、此時使用candle.exe編譯logAuditAgent.wxs得到logAuditAgent.wixobj,接著使用light.exe連線程式就得到了具備自動安裝解除安裝功能的msi安裝包logAuditAgent.msi。