Windows Installer XML 概述 (2)

Windows Installer XML, 或者wix, 提供一個描述Windows Installer database (MSI or MSM)的模式, 以及將XML描述文檔轉化成安裝包的一套工具包。第二版的模式(wix.xsd) 增加額外的內容, 使得由一套XML文檔創建多個Windows Installer安裝包更加容易。wix工具集可以模擬傳統的編譯和鏈接,從源代碼創建可執行的安裝包。

本文介紹如何使用工具包編譯和鏈接wix源代碼來生成Windows Installer安裝包。

注:本文假設你知道Windows Installer安裝包的格式。

.wxs & .wixobj – Windows Installer Xml Files
                                                                                          
在一個Windows Installer XML系統中,所有源文件的擴展名都是 .wxs 。就如同 .cpp 之於 C++ 或者.cs 之於 C#。.wxs 文件經過預處理和編譯生成擴展名爲.wixobj的文件。當所有源文件編譯成.wixobj文件後,就可以鏈接這些 .wixobj文件生成Windows Installer安裝包。
                                              
.wxs 文件結構

所有的 .wxs文件都是XML格式的文檔,以<Wix/>作爲根節點。 在預處理之前,文檔的其餘部分可能匹配 WiX schema,也可能不匹配。不管怎樣,預處理之後,所有源文件必須符合WiX schema的要求,否則編譯通不過。根元素 <Wix/> 最多隻能包含 <Product/>, <Module/>其中的一個作爲子元素。包含<Fragment/> 的個數不受限制。當源文件編譯生成.wixobj文件後,這3個子元素產生了3個新的節元素。因此,這三個子元素常常稱爲節元素。

需要特別注意的是,每個源文件只能有一個<Product/> 或者 <Module/>節元素,這是因爲他們將被編譯生成稱作入口節的特殊節元素。入口節是鏈接處理的起始點。有關節,入口節和全部的鏈接處理會在後面作詳細描述。

節元素的子元素定義了Windows Installer安裝包的內容。 <Property/>對應Property表,<Directory/> 對應Directory表。
大多數元素包含"ID"屬性,該屬性將作爲Windows Installer文件行的主鍵。 注意,WiX schema的第一版中,主鍵以元素的文本表示。由於一些原因,該方式並非合適,已經改爲"ID"屬性。大多數情況下, 當源文件編譯生成.wixobj文件後,"ID"屬性用來確定了一個標記號。
                                          
Symbols and references

.wixobj文件中的每一個標記號由元素名加"ID"屬性的唯一碼組成。標記號非常重要,因爲他們可以被其他任何源文件中節元素作爲引用對象。例如, <Directory/>可以包含在一個源文件的<Fragment/>裏,<Component/>包含在另一個源文件的<Fragment/>裏。在<Component/>下,通過添加<DirectoryRef/>創建一個顯性的引用對象,直接引用第一個文件中<Directory/>定義的標記號。鏈接程序負責將標記號和引用鏈接。某些情況下,編譯程序在處理源文件時會產生隱性引用。隱性引用具有與顯性引用相同的行爲。

除了上面提到的簡單引用,WiX還支持複雜引用。複雜引用是在鏈接程序必須生成額外的信息來鏈接標記號和引用時使用。複雜引用最好的例子是Windows Installer中Feature/Component的關係。當<Component/>被<Feature/>通過<ComponentRef/>顯性引用時,鏈接程序必須讀取<Feature/>的標記號和<Component/>的標記號,然後在FeatureComponents表中增加一個入口。

Feature/Component的關係甚至可以更復雜。因爲<Component/>中的某些元素,比如<Shortcut/>,包含指向與Component關聯的Feature的引用。這種來自<Component/>子元素的引用,被稱作反向引用,有時也稱作feature backlinks。複雜引用和反向引用的處理,可能是鏈接程序必須實現的最難的工作。

注意,標記號的定義和引用是WiX工具包第二版的新內容。之前的做法是必須將Components打包成Merge Modules,然後用merge進行標記號鏈接。新的系統在定義標記號方面更加靈活,避免了爲確保每個Merge Module唯一的過多開銷。

發佈了13 篇原創文章 · 獲贊 1 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章