由於工作需要,學習了一段時間Wix,總算小有起色。鑒於國內Wix 的普及和使用有限,這里將個人遇到得問題和解決方案記錄下來,以便交流和相互促進。
Wix :全稱 Windows Installer XML , 屬於微軟的一個開源項目,目標是使用 XML 語言靈活的定制具有各種功能的安裝包,需要微軟的 Windows Installer 服務支 持。
Wix 生 成的產品為 msi 文 件,這種可執行文件與 exe 文件最大的不同為,它更底層,安裝文件的同時可以對系統或者其他軟件進行設置。
下面的所有內容是基於 Wix3.0 版本。
Wix 基本入門資料:
Wix Document
Wix tutorial ( 僅支持到 Wix2.0)
這兩份資料都可以通過 Wix 的發布網站獲取。
1) Language 與 Codepage 的設置
Language 指所在地區使用的語言,為數字編號。 Codepage 指所在地區的代碼頁,用來進行 區域區分。 下來列舉幾個常見的區域代號: 語言 語言 - 國家 Language Codepage English en-us 1033 1252 Simplified Chinese zh-cn 2052 936 Traditional Chinese zh-tw 1028 950
2) GUID 的生成
在 VS2005 中,通過 “ 工具 ”——“ 創建 GUID” 生成。 GUID 也可以自行定義,但是前提是要保證唯一。
3) 安裝文件描述 XML 自動生成
當安裝文件特別多的時候,我們 就需要用專用的工具進行文件描述 XML 的自動生成了,采用的是 Wix 自帶的 heat 工具,位於安裝目錄的 bin 下。 Heat 的使用方法為: heat.exe [-?] harvestType < harvester arguments> -out sourceFile.wxs 詳細見 Wix 說明文檔。 例子: heat.exe dir ABC -gg -ke -sfrag -template:fragment -dr INSTALLLOCATION -cg BasicComponentGroup -srd -out ABC.wxs 作用為:將目錄 ABC (相對目錄)下的所有文件(包括空目 錄)作為一個 ComponentGroup 添加到 ABC.wxs 文件中,其中根目錄為 INSTALLLOCATION ,段標簽為 fragment , 運行這行命令會自動生成一個 wxs 文件,里面包含 ABC 目錄下所有文件的描述。
4) Feature 的選擇安裝
Wix 安裝包中所有的組件都是以 Feature 的方式安裝到系統中的, Level 是安裝級別,是最重要的屬性之一,不可缺少。 Level 的值為整型,最小為 0 ,最大 1000 。為 0 的時候此 Feature 不安裝。 一般來 說 Level 與選 擇安裝關聯,與之相對應的一個屬性為 INSTALLLEVEL ,默認為 1. 小於 1 的 Feature 將不會被安裝。 Level 值為 3 的 Feature 為 Typical 類型, Level 值大於 3 為 Complete 類型。 Level 也可以在安裝時動態修改,使用 <Condition> 條件判斷。例如: <Feature Id="DesktopFt" Title="Desktop" Level="1"> <Condition Level="0"><![CDATA[HASDESKTOP <> "1"]]></Condition> <ComponentRef Id="DesktopShortcutComponent"/> </Feature> 如果 HASDESKTOP 屬性值不為 1 ,那么此 Feature 的 Level 將為 0 ,不會被安裝。使用此種方式選擇安裝需注意 HASDESKTOP 屬性的初始化位置,一定要保證在 Feature 初始化前進行。否則設置無效。 也可以采用另一種方法選擇性安 裝: HASDESKTOP 屬性修改的地方添加 <Publish> 。 <Publish Event="AddLocal" Value="ALL">1</Publish> <Publish Event="Remove" Value="DesktopFt"><![CDATA[HASDESKTOP <> "1"]]></Publish> 這樣效果一樣,但是不需要 HASDESKTOP 的值的初始化在 Feature 之前。 詳細參考 http://www.joyofsetup.com/2007/05/30/feature-conditions-and-ui/ ( 附注: 注意此種方式下內置屬性 REMOVE 的值就不再為空,那么在安裝時也不能以 REMOVE 來判斷當前操作 )
5) Property 的使用
Wix 中使用自定義變量的方法為聲明 Property (屬性)。 Property 分為兩種:全局的和局部的。全 局屬性必須全部大寫,否則視為局部屬性。 例如: <Property Id="HASDESKTOP" Value="1"/> 如果改為小寫,那么其他文件(也許是 fragment )的代碼調用屬性無效。 搜索、判斷得到的屬性一律為全局 屬性,大寫。例如: <Property Id="VC71PATH"> <RegistrySearch Id="VC71" Type="raw" Root="HKLM" Key="SOFTWARE\Microsoft\VisualStudio\7.1" Name="InstallDir"/> < /Property> 上述例子為在注冊表中查找 VC71 的 InstallDir 的值,如存在將值付給 VC71PATH ,不存在則 VC71PATH 為空。
6) 安裝包的中文化
Wix 默認的語言為 en-us ,中文化需要另外添加 zh-cn 或 zh-tw 的描述文件。 擁有了中文拓展的文件以后,在代碼中使用 loc 調用屬性即可,使用方式與 en-us 無異。 當然也可以自定義一些中文化的標簽,格式為: <WixLocalization Culture="zh-cn" xmlns="http://schemas.microsoft.com/wix/2006/localization"> < String Id="LicenseThirdPartText" Overridable="yes"> 請仔細閱讀以下聲明 </String> < /WixLocalization> 調用方式為: text =”!(loc.LicenseThirdPartText)”
中文語言包下載地址為:http://download.csdn.net/salever
7) 內置 CustomAction 的使用
1. Quiet Execution Custom Action 安靜模式下執行操作。允許用戶在后台執行一些命令,但是不 出現執行窗口。 例 1 ,安靜模式下執行 CMD 操作 <Property Id="QtExecCmdLine" Value="command line to run"/> < CustomAction Id="QtExecExample" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="immediate" Return="check"/> < InstallExecuteSequence> <Custom Action="QtExecExample" After="TheActionYouWantItAfter"/> < /InstallExecuteSequence> 采用安靜模式執行 CMD 操作,但是不出現 CMD 命令窗口。注意 Value 中的命令以及應用程序必須加引 號,即使沒有空格也要加上。
例 2 ,安靜模式下執行其他應用程序操作 <CustomAction I d="QtExecDeferredExampleWithProperty_Cmd" Property="QtExecDeferredExampleWithProperty" Value=""[#MyExecutable.exe]"" Execute="immediate"/> < CustomAction Id="QtExecDeferredExampleWithProperty" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Return="check" Impersonate="no"/>
< InstallExecuteSequence> <Custom Action="QtExecDeferredExampleWithProperty_Cmd" After="CostFinalize"/> <Custom Action="QtExecDeferredExampleWithProperty" After="TheActionYouWantItAfter"/> < /InstallExecuteSequence>
2.ShellExecute CustomAction 執行打開文檔或 URL 等操作。典型應用為安裝完成后打開幫助 文件或則運行安裝程序。 例: <Property Id="WixShellExecTarget" Value="myapplication.exe" /> <CustomAction Id="LaunchApplication" BinaryKey="WixCA" DllEntry="WixShellExec" Impersonate="yes" /> </Product>