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


關於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在默認情況下是有效的、可安裝的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM