關於WiX文件格式
.wxs是WiX的源文件擴展名。.wxs文件以類XML文件的格式來指定了要構造Windows Installer安裝數據包.msi文件所需的信息。
.wxs的文件格式為:
<?xml version="1.0"?> <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> … </Wix>
.wxs必須只有一個根元素,即<Wix>。在<Wix>下至多有一個下列的直接子元素:<Product>、<Module>或<Patch>;但是可以擁有不限個數的<Fragment>子元素。通過<Product>元素或<Fragment>元素的子元素即可指定Windows Installer安裝包MSI文件的內容。
Wix是一個功能性的描述語言而非命令式規定性語言。各種元素可在不同地方進行描述,並且僅當它們之間存在依賴關系時,其中一個元素可以通過必須提供的唯一標識符來引用另一個元素。
HelloWorld的分析
下面我們對前面的案例HelloWorld的.wxs文件進行簡單分析,這樣就可以對.wxs有個基本的認識。為了方便,我們將該.wxs文件復制在下面。
Product.wxs
<?xml version="1.0" encoding="UTF-8"?> <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> <Product Id="*" Name="HelloWorld" Language="1033" Version="1.0.0.0" Manufacturer="LEH" UpgradeCode="1de12ee7-2e94-42ac-979f-06245a0ade30"> <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" /> <Media Id="1" Cabinet="media1.cab" EmbedCab="yes" /> <Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="ProgramFilesFolder"> <Directory Id="INSTALLFOLDER" Name="HelloWorld"> <Component Id="ProductComponent" Guid="B5F0C012-49D6-4C63-AFCA-0CE6C24C6D7D"> <File Id="HelloWorld" Source="HelloWorld.exe" /> </Component> </Directory> </Directory> </Directory> <Feature Id="ProductFeature" Title="HelloWorld" Level="1"> <ComponentRef Id="ProductComponent" /> </Feature> </Product> </Wix>
在<Product>屬性中,指定了安裝包的五個必需屬性ProductCode、ProductName、Manufacturer、ProductLanguage和ProductVersion,其分別對應了<Product>元素的五個屬性upgradeCode、Name、Manufacturer、Language和version。
定義目錄結構
目錄通過<Directory>元素來定義,其描述了我們要安裝在目標計算機上的文件夾結構。案例HelloWorld中定義目錄結構的語句如下:
<Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="ProgramFilesFolder"> <Directory Id="INSTALLFOLDER" Name="HelloWorld"> … </Directory> </Directory> </Directory>
Id為TARGETDIR的<Directory>元素是Windows Installer要求必須有的,並且其是我們安裝目錄結構的根目錄。而Id為ProgramFilesFolder的<Directory>元素指定了目標計算機上的Program Files文件夾,ProgramFilesFolder是Windows Installer預定義的一個屬性,通常其屬性值為C:\Program Files\。第三個<Directory>元素則指定了我們安裝的軟件在Program Files文件夾下的子文件夾,這里該子文件夾命名為HelloWorld,而Id指定為INSTALLFOLDER,該標識符Id可以在.wxs文件中任意地方進行引用,另外該Id采用全大寫字母,是為了能夠在安裝的命令行或者用戶界面中對該值進行定義,這樣也可以改變我們安裝的產品在目標計算機上的路徑(WiX中Id為全大寫形式的屬性值可稱為全局屬性,其值可以在命令行或者用戶界面上進行改變)。
於是,我們的HelloWorld將被安裝在路徑C:\Program Files\HelloWorld\下。
添加文件HelloWorld.exe至安裝包
上一篇隨筆說過,Component是安裝的基本單元,而Component則是由文件,或快捷方式,或注冊表鍵值,或它們的組合來組成的。於是,要將一個文件添加到安裝包中,則需要兩個元素<Component>和<File>。下面是案例HelloWorld中將文件HelloWorld.exe文件添加到安裝包中的語句。
<Component Id="ProductComponent" Guid="B5F0C012-49D6-4C63-AFCA-0CE6C24C6D7D"> <File Id="HelloWorld" Source="HelloWorld.exe" /> </Component>
<Component>元素在定義在Id為INSTALLFOLDER的<Directory>元素下的,這樣我們的HelloWorld.exe文件將被安裝在路徑C:\Program Files\HelloWorld\下。每一個Component必須有且只有一個關聯目錄。<Component>元素的Id用於在.wxs文件的任意地方引用該<Component>元素,而Guid元素指定的GUID值則是用於Windows Installer對該Component進行跟蹤的,<Component>元素的GUID值必須的全大寫,並且是唯一的。
在<Component>元素下,<File>元素將指定我們要安裝的HelloWorld.exe文件。屬性Id的值HelloWorld用於標識該<File>元素,可在.wxs文件任意地方通過其來引用該<File>文件。而屬性Source指定了文件HelloWorld.exe在我們機器上的路徑,這樣WiX就可以找到它並把它添加的安裝包MSI文件中。
另外,<File>元素還有一個KeyPath屬性和CheckSum屬性。若我們將KeyPath屬性設置為Yes,則Windows Installer將會根據這個<File>元素指定的文件來判斷該Component是否已被安裝。若我們沒有設置KeyPath屬性,則Windows Installer將會順序地掃描該<Component>下的子元素,然后自動選擇一個子元素作為該Component已被安裝的判據。可執行文件頭部通常有一個校驗和,於是對可執行文件,我們通常將CheckSum屬性設置為Yes,這樣在我們進行安裝修復時,就可以通過該校驗和來判斷該文件的有效性。
告訴Windows Installer安裝文件HelloWorld.exe
要想安裝HelloWorld.exe文件,需要將包含該文件的<Component>元素包含進一個<Feature>中。<Feature>將我們的產品划分為一些邏輯上的部件,這樣用戶可以獨立地對它們分別進行安裝。下面就是我們的HelloWorld案例中定義的<Feature>元素。
<Feature Id="ProductFeature" Title="HelloWorld" Level="1"> <ComponentRef Id="ProductComponent" /> </Feature>
在<Feature>元素的子元素中,通過一個<ComponentRef>元素來引用Id為ProductComponent的<Component>元素,也就是說該Feature是由Id為ProductComponent的Component組成的,該Component中包含我們的HelloWorld.exe文件,於是當我們選擇安裝該Feature時,即安裝了我們的HelloWorld.exe文件。<Feature>元素的Title屬性設置為HelloWorld,如果我們的安裝過程有UI界面並且有Feature選擇界面,則在Feature選擇界面中將顯示該Feature的標題HelloWorld。而<Feature>元素的Level屬性設置為1,表明該Feature在默認情況下是有效的、可安裝的。
