如何:添加文件到安装包
如何:添加文件到安装包
安装文件是一个安装包最基本的工作,同时也是制作安装包的首要方面。学习如何使用Windows Installer较好的处理文件不仅仅能确保安装包的可维护性,也是后期创建补丁包的必要条件。
第一步:定义文件夹结构
通常安装包会频繁的向磁盘上相对少量的文件夹中写入大量的文件。为了改善WiX工程文件的可读性,最好的方法就是在列出你要安装的文件之前首先定义你的安装文件夹。 文件夹是使用<Directory>元素定义并描述你希望在目标机器上实现的树形目录。下面的例子为将要安装的主程序的可执行文件定义了一个文件夹。
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="APPLICATIONROOTDIRECTORY" Name="My Application Name"/>
</Directory>
</Directory>
id为TARGETDIR的元素是Windows Installer所必须的,并且是安装的所有文件夹的根文件夹。每一个WiX工程都会有这个元素。第二个元素,id是ProgramFilesFolder的,使用了一个预定义的Windows Installer Property来引用用户机器上的Program Files文件夹。一般情况下会被解析为“c:\Program Files\”。第三个Directory元素在Program Files下面创建你的应用程序文件夹,id值APPLICATIONROOTDIRECTORY在稍后的WiX工程中使用。id全部用大写字母是为了让它成为一个可以在UI中或者通过命令行设置的公共Property。
这些标记的最终结果就是在目标机器上生成一个 “c:\Program Files\My Application Name”文件夹。
第二步: 添加文件到你的安装包
添加文件到安装包需要用两个元素:一个<Component> 元素来指定一个安装包的原子单元(atomic unit)和一个<File>元素来指定需要安装的文件。
<Component> 元素将一个要被安装的资源(通常为文件、注册表项、快捷方式)的集合综合为一个独立的单元。注意这里要区别于第三步中所述的由若干子项组成的可以被用户选择的Feature。虽然这些差别在制作你的第一个安装包的时候并不那么重要,但是当你日后创建补丁包的时候Component将会扮演一个非常重要的角色。
通常情况下,应该保证每一个File在一个单独的Component中。 Windows Installer设计的初衷是在一个安装包中容纳非常多的(thousands of)Component,所以除非你有非常特殊的原因,都应该保证一个文件对应一个Component。每一个Component必须指定一个唯一的GUID。不遵守这两条基本规则将在安装包的维护上留下相当多的隐患。
下面的例子使用第一步中定义好的文件夹结构来安装两个文件:一个可执行文件和一个文档文件。
<DirectoryRef Id="APPLICATIONROOTDIRECTORY">
<Component Id="myapplication.exe" Guid="PUT-GUID-HERE">
<File Id="myapplication.exe" Source="MySourceFiles\MyApplication.exe" KeyPath="yes" Checksum="yes"/>
</Component>
<Component Id="documentation.html" Guid="PUT-GUID-HERE">
<File Id="documentation.html" Source="MySourceFiles\documentation.html" KeyPath="yes"/>
</Component>
</DirectoryRef>
<Directory>元素用来引用第一部中创建的文件夹结构。通过引用id为APPLICATIONROOTDIRECTORY的Directory,文件将被安装到c:\program files\My Application Name 文件夹。DirectoryRef下面包含两个Component元素,每个将要被安装的文件都对应一个Component元素。 这里与“一个Component一个File”的原则保持了一致。 每一个Component元素都被赋予了一个Id和一个Guid。Id用来在稍后的WiX工程中引用Component。 对于每一个Component来说Guid是唯一的,用来制作补丁包。获取更多关于生成GUID的信息请参阅如何:生成一个GUID。
每一个Component下面是一个File元素,这些File元素才是真正将你的源文件(需要打包的文件)打包进安装包中起作用的元素。Id是留给WiX工程中其他地方引用的。Source属性指定源文件在你的机器上的位置, 以便WiX找到并打包进安装包中。
KeyPath属性设置为yes用来告诉Windows Installer这是一个用来判断Component是否已经被安装的文件。当你确保了“一个Component一个File”的原则的时候,你应该确保KeyPath总为yes。对于一个可执行文件来说Checksum属性总是应该设置为yes来在文件头(file header )产生一个验证值, 这个验证值将被Windows Installer用来在重新安装时验证文件的正确性。
第三步: 告诉Windows Installer安装文件
在定义了文件夹结构并且列出了需要打包的文件之后,最后一步就是要告诉Windows Installer如何真正的执行安装了。 <Featrue>元素就是用来完成这项工作的,不仅如此,它更能将你的安装包分成若干逻辑块来让用户有选择的独立安装它们。下面的例子创建了单个Featrue来安装第二部中的可执行文件和文档。
<Feature Id="MainApplication" Title="Main Application" Level="1">
<ComponentRef Id="myapplication.exe" />
<ComponentRef Id="documentation.html" />
</Feature>
Feature被赋予一个ID。 如果你使用了一个包含Feature选择的安装包用户界面序列(installer UI sequence ),Title属性是设置显示在用户界面上针对此Feature的说明文字。 Level属性设置为1说明默认安装此项。
<ComponentRef>元素通过ID属性来引用第二部中创建的Component。
代码示例
下面是一个上面步骤的完整示例 这个示例可以被插入WiX工程编译,或者通过命令行进行编译链接,来生成一个安装包。
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" UpgradeCode="PUT-GUID-HERE" Version="1.0.0.0" Language="1033" Name="My Application Name" Manufacturer="My Manufacturer Name">
<Package InstallerVersion="300" Compressed="yes"/>
<Media Id="1" Cabinet="myapplication.cab" EmbedCab="yes" />
<!-- Step 1: Define the directory structure -->
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="APPLICATIONROOTDIRECTORY" Name="My Application Name"/>
</Directory>
</Directory>
<!-- Step 2: Add files to your installer package -->
<DirectoryRef Id="APPLICATIONROOTDIRECTORY">
<Component Id="myapplication.exe" Guid="PUT-GUID-HERE">
<File Id="myapplication.exe" Source="MySourceFiles\MyApplication.exe" KeyPath="yes" Checksum="yes"/>
</Component>
<Component Id="documentation.html" Guid="PUT-GUID-HERE">
<File Id="documentation.html" Source="MySourceFiles\documentation.html" KeyPath="yes"/>
</Component>
</DirectoryRef>
<!-- Step 3: Tell WiX to install the files -->
<Feature Id="MainApplication" Title="Main Application" Level="1">
<ComponentRef Id="myapplication.exe" />
<ComponentRef Id="documentation.html" />
</Feature>
</Product>
</Wix>