天天看點

Wix學習整理(4)——關于WiX檔案格式和案例HelloWorld的分析關于WiX檔案格式HelloWorld的分析

.wxs是WiX的源檔案擴充名。.wxs檔案以類XML檔案的格式來指定了要構造Windows Installer安裝資料包.msi檔案所需的資訊。

.wxs的檔案格式為:

.wxs必須隻有一個根元素,即<Wix>。在<Wix>下至多有一個下列的直接子元素:<Product>、<Module>或<Patch>;但是可以擁有不限個數的<Fragment>子元素。通過<Product>元素或<Fragment>元素的子元素即可指定Windows Installer安裝包MSI檔案的内容。

Wix是一個功能性的描述語言而非指令式規定性語言。各種元素可在不同地方進行描述,并且僅當它們之間存在依賴關系時,其中一個元素可以通過必須提供的唯一辨別符來引用另一個元素。

下面我們對前面的案例HelloWorld的.wxs檔案進行簡單分析,這樣就可以對.wxs有個基本的認識。為了友善,我們将該.wxs檔案複制在下面。

Wix學習整理(4)——關于WiX檔案格式和案例HelloWorld的分析關于WiX檔案格式HelloWorld的分析
Wix學習整理(4)——關于WiX檔案格式和案例HelloWorld的分析關于WiX檔案格式HelloWorld的分析

Product.wxs

在<Product>屬性中,指定了安裝包的五個必需屬性ProductCode、ProductName、Manufacturer、ProductLanguage和ProductVersion,其分别對應了<Product>元素的五個屬性upgradeCode、Name、Manufacturer、Language和version。

目錄通過<Directory>元素來定義,其描述了我們要安裝在目标計算機上的檔案夾結構。案例HelloWorld中定義目錄結構的語句如下:

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\下。

上一篇随筆說過,Component是安裝的基本單元,而Component則是由檔案,或快捷方式,或系統資料庫鍵值,或它們的組合來組成的。于是,要将一個檔案添加到安裝包中,則需要兩個元素<Component>和<File>。下面是案例HelloWorld中将檔案HelloWorld.exe檔案添加到安裝包中的語句。

<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,這樣在我們進行安裝修複時,就可以通過該校驗和來判斷該檔案的有效性。

要想安裝HelloWorld.exe檔案,需要将包含該檔案的<Component>元素包含進一個<Feature>中。<Feature>将我們的産品劃分為一些邏輯上的部件,這樣使用者可以獨立地對它們分别進行安裝。下面就是我們的HelloWorld案例中定義的<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在預設情況下是有效的、可安裝的。