[译]:WiX Toolset使用技巧——文件处理

标签: WiX Toolset, 官方教程, 中文翻译

博客分类: 官方教程

返回目录索引
原文地址:

译文地址:WiX Toolset使用技巧——文件处理

为安装包添加文件

安装文件是任何安装包中最基础的方面,而且通常是人们建立安装包的首要因素。学习如何使用Windows Installer最佳实践将文件布置到磁盘上,不仅仅需要确保以后的可维护性,还需要以后能够构建补丁。

第一步:定义目录结构

安装程序经常会有许多文件要安装到磁盘上的几个位置。为了提高WiX文件的可读性,最好是在列出要安装的文件之前定义你的安装目录。目录定义使用<Directory>元素,并按照你将会在目标机器上看到的文件夹一样的描述层次结构。下面示例定义了主应用程序可执行文件的目录。

<Directory Id="TARGETDIR" Name="SourceDir">
    <Directory Id="ProgramFilesFolder">
        <Directory Id="APPLICATIONROOTDIRECTORY" Name="My Application Name"/>
    </Directory>
</Directory>

在Windows安装程序中,使用TARGETDIR为id的元素是必需的,它是你在安装过程中所有目录结构的根目录。每个WiX项目都会有此目录元素。关于其中id为ProgramFilesFolder的元素,它使用了预定义的Windows安装程序属性,其值为用户计算机的Program Files文件夹。在大多数情况下,此值为C:\Program Files。上述第三个元素在用于在Program Files中将建你应用的文件夹,并为其指定了id值APPLICATIONROOTDIRECTORY,此值会在WiX项目中后面使用。此id值为全大写字母,是为了将它设置为公共属性,以便于可以从UI或命令行设置它。上述示例在目标机器的标记结果是C:\Program Files\My Application Name文件夹。

第二步:为安装包添加文件

将文件添加到安装包中需要用到两个元素:<Component>元素——指定安装工作的最小单位;<File>元素——指定要安装的文件。

component元素描述需要安装到单个单元中的一组资源(通常是文件,注册表项和快捷方式)。这会在组装逻辑功能时,进行项目集合的拆分,以此让用户可以选择哪些功能需要安装(在第三步里面进行讨论)。当你第一次编写安装程序时,这看起来并不是大问题,但是component在你以后需要创建补丁包是会是一个关键性的角色。

一般来说,你应该限制每一个组件含有一个文件。Windows安装程序旨在在单个安装程序中支持上千个组件,因此,若非有很好的理由,保持一个组件中只有一个文件。每一个组件必须有自己的唯一的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>

<DirectoryRef>元素是用于引用第一步中建立的目录结构。通过引用APPLICATIONROOTDIRECTORY目录,文件将会安装到文件夹c:\program files\My Application Name下面。在DirectoryRef下有两个组件元素,每个组件下各有一个文件需要安装。这是符合每个组件元素下含有一个文件的最佳实践的。每一个组件元素都指定了Id和Guid。Id是用于WiX项目中后面引用组件。Guid则用于以后补丁处理,且必须唯一。关于更多GUID的生成内容见:原文:How To: Generate a GUID

在每个组件下面有一个文件元素,它是安装包需要真正处理打包的源文件。Id用于在WiX项目中的其他位置使用文件。Source属性指定了你机器上文件的位置,这样WiX才能找到文件并将其加入到安装程序中。

KeyPath属性设置为yes,则表示告诉Windows安装包,使用此特定的文件来判断当前组件是否已经安装。如果没有设置KeyPath属性,WiX则按照顺序查看组件下的子元素,然后自动选择一个作为关键路径。让WiX自动选择关键路径是危险的,因为当你添加或删除组件的子元素时,可能会在无意中改变了关键路径 —— 这会导致安装问题。一般来说,你应该设置KeyPath属性,以此保证在以后安装文件更新中,不会在无意中更改关键路径。

在可执行文件上中,应该将Checksum属性设置为yes,因为它在文件开头含有校验和值(通常适用于所有可执行文件),并且它会用于在Windows安装程序重新安装过程中,对文件进行有效性验证。

第三步:告诉Windows安装程序要安装的文件

在定义了目录结构并将文件列表打包到安装程序后,最后一步就是告诉Windows安装程序要安装哪些文件了。<Feature>元素就是用来处理这个的,并且你可以在这将安装程序分解成逻辑块,然后用户可以单独安装他们。下面示例 创建了单个功能,里面的应用可执行文件和文档是在第2步里面配置的:

<Feature Id="MainApplication" Title="Main Application" Level="1">
    <ComponentRef Id="myapplication.exe" />
    <ComponentRef Id="documentation.html" />
</Feature>

Feature需要指定Id值。如果你使用的安装程序的UI集中含有功能选择界面,Title属性包含了在UI里面显示功能的文本内容。Level属性设置为1是让安装程序对此功能默认安装。

<ComponentRef>元素是用于引用第二步中创建的component(通过Id属性)。

完整示例代码

以下代码为上述内容的完整示例。此示例可以添加到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>

在安装期间检查文件版本号

安装程序经常会需要在安装过程中查看磁盘上的文件版本号。此检查通常会在后面安装中作为前提条件使用,例如,如果文件丢失,则阻止用户安装;或者用于判断文件版本是否够高来控制自定义UI的显示。本节演示了如何检验磁盘上的文件版本,并在文件版本低于预期版本时,阻止应用安装程序。

第一步:确定文件版本

文件版本由<Property><DirectorySearch><FileSearch>元素来确定。以下代码段检查机器System32目录下的user32.dll文件,并检查它是否是高于版本号6.0.6001.1751:

<Property Id="USER32VERSION">
    <DirectorySearch Id="SystemFolderDriverVersion" Path="[SystemFolder]">
        <FileSearch Name="user32.dll" MinVersion="6.0.6001.1750"/>
    </DirectorySearch>
</Property>

搜索文件的实现方式是:先描述要搜索的目录,然后指定目录下相应的文件。

Property元素定义了文件搜索结果的Id。此Id值会在WiX项目中后面的内容中使用,例如在条件里。DirectorySearch元素用于构建要搜索的文件所在的目录层次结构。在本示例中,它指定了唯一Id,且路径设置为SystemFolder —— 此路径为Windows安装程序内定义的路径,它指向用户的Windows\System32目录。FileSearch元素指定了在DirectorySearch中指定的目录下要检查的文件。MinVersion属性指定了要查找文件的最小版本号。

如果文件成功找到,USER32VERSION属性就会设置为user32.dll文件的完整路径。

注意:当对文件执行搜索时,必须将MinVersion属性设置为低于实际搜索版本号的值。如在本示例中,当我们需要查找版本号为6.0.6001.1751的文件时,MinVersion就 需要设置为6.0.6001.1750。这是因为Windows安装程序匹配文件版本的处理方式。关于更多Windows Install文档信息见:Windows Installer

第二步:在条件中使用property

一旦确定是否含有要求版本的文件后,你可以在条件中使用property值。以下示例为如果user32.dll文件版本太低,则阻止应用安装:

<Condition Message="The installed version of user32.dll is not high enough to support this installer.">
    <![CDATA[Installed OR USER32VERSION]]>
</Condition>

Installed是一个Windows安装程序的属性,它确保只有在用户安装应用时执行检查,而不是在修复或移除 时。如果USER32VERSION部分设置内容(任何内容),则通过;如果没有,则失败。文件检查在第一步中处理,如果找到则属性值设置为user32.dll文件完整路径;如果没有找到相应版本号的文件,则不会设置属性值。


译:奇葩史

没有评论