杉宫竹苑工作室

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2893|回复: 0

WiX Toolset使用技巧——文件处理

[复制链接]
发表于 2017-4-8 13:42:58 | 显示全部楼层 |阅读模式

正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

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

第一步:定义目录结构
安装程序经常会有许多文件要安装到磁盘上的几个位置。为了提高WiX文件的可读性,最好是在列出要安装的文件之前定义你的安装目录。目录定义使用<Directory>元素,并按照你将会在目标机器上看到的文件夹一样的描述层次结构。下面示例定义了主应用程序可执行文件的目录。
  1. <Directory Id="TARGETDIR" Name="SourceDir">
  2.     <Directory Id="ProgramFilesFolder">
  3.         <Directory Id="APPLICATIONROOTDIRECTORY" Name="My Application Name"/>
  4.     </Directory>
  5. </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。如果不遵守这两个基本规则,在使用服务时,可能会遇到很多问题。

下面代码示例中,使用了第一步中定义的目录结构,并为其添加了两个文件:一个应用可执行文件和一个文档文件。
  1. <DirectoryRef Id="APPLICATIONROOTDIRECTORY">
  2.     <Component Id="myapplication.exe" Guid="PUT-GUID-HERE">
  3.         <File Id="myapplication.exe" Source="MySourceFiles\MyApplication.exe" KeyPath="yes" Checksum="yes"/>
  4.     </Component>
  5.     <Component Id="documentation.html" Guid="PUT-GUID-HERE">
  6.         <File Id="documentation.html" Source="MySourceFiles\documentation.html" KeyPath="yes"/>
  7.     </Component>
  8. </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步里面配置的:
  1. <Feature Id="MainApplication" Title="Main Application" Level="1">
  2.     <ComponentRef Id="myapplication.exe" />
  3.     <ComponentRef Id="documentation.html" />
  4. </Feature>
复制代码

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

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

完整示例代码
以下代码为上述内容的完整示例。此示例可以添加到WiX项目中,并利用命令行编译链接来生成安装程序:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  3.     <Product Id="*" UpgradeCode="PUT-GUID-HERE" Version="1.0.0.0" Language="1033" Name="My Application Name" Manufacturer="My Manufacturer Name">
  4.         <Package InstallerVersion="300" Compressed="yes"/>
  5.         <Media Id="1" Cabinet="myapplication.cab" EmbedCab="yes" />

  6.         <!-- Step 1: Define the directory structure -->
  7.         <Directory Id="TARGETDIR" Name="SourceDir">
  8.             <Directory Id="ProgramFilesFolder">
  9.                 <Directory Id="APPLICATIONROOTDIRECTORY" Name="My Application Name"/>
  10.             </Directory>
  11.         </Directory>

  12.         <!-- Step 2: Add files to your installer package -->
  13.         <DirectoryRef Id="APPLICATIONROOTDIRECTORY">
  14.             <Component Id="myapplication.exe" Guid="PUT-GUID-HERE">
  15.                 <File Id="myapplication.exe" Source="MySourceFiles\MyApplication.exe" KeyPath="yes" Checksum="yes"/>
  16.             </Component>
  17.             <Component Id="documentation.html" Guid="PUT-GUID-HERE">
  18.                 <File Id="documentation.html" Source="MySourceFiles\documentation.html" KeyPath="yes"/>
  19.             </Component>
  20.         </DirectoryRef>

  21.         <!-- Step 3: Tell WiX to install the files -->
  22.         <Feature Id="MainApplication" Title="Main Application" Level="1">
  23.             <ComponentRef Id="myapplication.exe" />
  24.             <ComponentRef Id="documentation.html" />
  25.         </Feature>
  26.     </Product>
  27. </Wix>
复制代码

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

第一步:确定文件版本
文件版本由<roperty>、<DirectorySearch>和<FileSearch>元素来确定。以下代码段检查机器System32目录下的user32.dll文件,并检查它是否是高于版本号6.0.6001.1751:
  1. <Property Id="USER32VERSION">
  2.     <DirectorySearch Id="SystemFolderDriverVersion" Path="[SystemFolder]">
  3.         <FileSearch Name="user32.dll" MinVersion="6.0.6001.1750"/>
  4.     </DirectorySearch>
  5. </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文件版本太低,则阻止应用安装:
  1. <Condition Message="The installed version of user32.dll is not high enough to support this installer.">
  2.     <![CDATA[Installed OR USER32VERSION]]>
  3. </Condition>
复制代码

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SgzyStudio

GMT+8, 2024-4-28 07:46 , Processed in 0.110856 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表