Windows Installer XML 概述 (2)

来源:互联网 发布:吴镇宇曹格 知乎 编辑:程序博客网 时间:2024/06/05 00:55

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唯一的过多开销。