最近研究了一下WIX打包,简单总结一下,方便自己以后查阅,也希望能给需要的人一些提示和帮助。
WiX 简介
Windows Installer XML (WiX ) 平台是一组工具与规范,使您能够创建 Microsoft Windows Installer 数据库文件(MSI 和 MSM)。WiX 的源代码是使用 XML 文件编写的。WiX 源代码经过预处理、编译与链接,以创建 Windows Installer 数据库。
WiX 的下载地址:http://wix.sourceforge.net/ 。目前WiX 的最新版本是 WiX v3.11.2。
初识WIX
WIX软件正常安装就可以,在此就不介绍了。
WIX使用XML源文件来描述安装内容,我们先来了解一下它的格式。先上一个简单的例子。
<?xml version="1.0" encoding="utf-8"?> <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> <Product Id="*" Name="test" Language="1033" Version="1.0.0.0" Manufacturer="HP Inc." UpgradeCode="35debc95-0757-4f41-b6fb-53f9e5a599d9"> <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine"/> <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed."/> <MediaTemplate EmbedCab="yes"/> <UIRef Id="WixUI_Mondo"/> <UIRef Id="WixUI_ErrorProgressText"/> <Feature Id='Complete' Title="test" Level='1' Description='The complete package.' Display='expand' ConfigurableDirectory='INSTALLDIR'> <Feature Id="MainProgram" Title="Main Program" Description='The main executable.' Level="1"> <ComponentGroupRef Id="MainProgram"/> </Feature> <Feature Id="UserGuide" Title="User Guide" Description="The user guide." Level="1000"> <ComponentRef Id="UserGuide"/> </Feature> </Feature> </Product> <Fragment> <Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="ProgramFilesFolder"> <Directory Id="ManufacturerDir" Name="HP"> <Directory Id="INSTALLDIR" Name="test"/> </Directory> </Directory> <Directory Id="ProgramMenuFolder" Name="Programs"> <Directory Id="ProgramMenuDir" Name="test"/> </Directory> <Directory Id="DesktopFolder" Name="Desktop"/> </Directory> </Fragment> <Fragment> <ComponentGroup Id="MainProgram"> <Component Id="MainExecutable" Directory="INSTALLDIR" Guid="5F2EB9AE-30ED-4D77-9860-E1BA27369FFC"> <File Id="TestEXE" Name="test.exe" Source="test.exe" KeyPath="yes"> <Shortcut Id="StartmenuTest" Directory="ProgramMenuDir" Name="test" WorkingDirectory="INSTALLDIR" Advertise="yes"/> <Shortcut Id="DesktopTest" Directory="DesktopFolder" Name="test" WorkingDirectory="INSTALLDIR" Advertise="yes"/> </File> </Component> <Component Id="MsvcrLibrary" Directory="INSTALLDIR" Guid="248E920F-A3DF-4EBE-9ACE-14C20E2624DB"> <File Id="MsvcrDLL" Name="msvcr120.dll" Source="msvcr120.dll" KeyPath="yes"/> </Component> <Component Id="CompProgramMenuDir" Directory="ProgramMenuDir" Guid="D42B8DC0-576A-47E9-B016-95847D454DC8"> <Shortcut Id="UninstallProduct" Name="Uninstall" Directory="ProgramMenuDir" Target="[SystemFolder]msiexec.exe" Arguments="/x [ProductCode]" Description="Uninstall"/> <RemoveFolder Id='ProgramMenuDir' On='uninstall' /> <RegistryValue Root='HKCU' Key='Software\[Manufacturer]\[ProductName]' Type='string' Value='' KeyPath='yes' /> </Component> </ComponentGroup> <Component Id="UserGuide" Directory="INSTALLDIR" Guid="A1583723-AD99-4D14-8C7C-875517EEB395"> <File Id="UserGuide" Name="user guide.txt" Source="user guide.txt" KeyPath="yes"> <Shortcut Id="StartMenuUserGuide" Directory="ProgramMenuDir" Name="User guide" Advertise="yes"/> </File> </Component> </Fragment> </Wix>
在这个例子中,实现将一个包含三个文件(test.exe,msvcr120.dll,user guide.txt)的程序打包。我们来看一下 test.wxs 文件都包含了哪些内容:
- Product:是发布的产品的基本信息,主要有Id,Language等属性。
Name:产品名称
Id:产品的GUID,GUID可以借助VS-->工具--->创建GUID 来生成;也可通过vbs来获得:Wscript.Echo CreateObject("Scriptlet.TypeLib").Guid
Language:指所在地区使用的语言,为数字编号。英语为1033,中文简体为2052
Version:版本号
Manufacturer:制作厂商
UpgradeCode:产品更新的GUID
-
- Package:记录一些安装包的信息
- InstallerVersion:安装此安装包需要的最小Windows Installer版本
- Compressed: 这个为Yes 表示在源文件中含有压缩文件
- InstallScope: 值为枚举类型,字面意思为安装范围,值必须是perMachine 或者 perUser.
- MajorUpgrade:支持防降级安装
- Package:记录一些安装包的信息
-
- MediaTemplate: 设置介质属性。设置EmbedCab="yes"会把.cab文件合并到msi中,不设置的话会多出一个.cab后缀的文件。
-
UIRef:UI风格。WiX工具集附带了一个标准的用户界面库,有五种不同的风格,分别是:WixUI_Mondo,WixUI_FeatureTree,WixUI_InstallDir ,WixUI_Minimal 和 WixUI_Advanced
-
- Feature:定义安装的部件,可以将不同用处的安装文件放到不到的Feature部件中。它是可安装的最小单元。 子元素主要有ComponentRef和ComponentGroupRef,它们和Fragment中的Component和ComponentGroup相对应 。
- Level:该功能的安装级别。当安装程序运行时,将有一个名为INSTALLLEVEL的预制属性,其值可以在1到32767之间。如果某个功能的级别为非零且不高于INSTALLLEVEL的当前值,则将安装该功能。在WIX的界面中,对于典型的安装,INSTALLLEVEL设置为3,对于完整的安装,置为1000
- Display:设置界面中Feature树是折叠、展开还是不显示
- ConfigurableDirectory:设置INSTALLDIR为初始安装路径,并允许用户修改
- Feature:定义安装的部件,可以将不同用处的安装文件放到不到的Feature部件中。它是可安装的最小单元。 子元素主要有ComponentRef和ComponentGroupRef,它们和Fragment中的Component和ComponentGroup相对应 。
- Fragment:代码片段。我理解是将一些具体的描述放入其中。一般至少有两个Fragment块。一个包含Directory,一个包含Component或ComponentGroup,前者指的是安装目录,后者指的是组件或组件集合。
-
- Directory:使用嵌套的结构描述文件夹的层次。从最外面的文件夹开始,即整个安装的根目标文件夹,它有一个预定义的TARGETDIR标识符,它将被设置为源文件的根目录,该根目录还具有一个预定义的名称:SourceDir。安装程序环境还为其它几个常用的路径提供了预定义的名称,允许我们非常容易地引用它们,比如:ProgramFilesFolder、ProgramMenuFolder和DesktopFolder。
- ComponentGroup和Component:组件的概念及其使用规则可能是Windows安装程序技术中最重要的概念。组件是要安装的原子单位。它由资源(文件、注册表项、快捷方式或其他任何东西)组成,这些资源应始终作为一个单元安装。安装组件不应影响其他组件,删除一个组件不应损坏另一个组件,因此,同一位置的同一个文件不能包含在多个组件中。
对于标签中的各个属性就不一一说明了,另外一些很有用的标签(比如:Condition,Property,RegistryKey),感兴趣可以慢慢研究。
打包
当 test.wxs 文件准备好之后,就可以进行程序打包了。WIX的工具集提供了很多命令,一般来说下面两个命令用得最多的。
candle.exe test.wxs
执行上述命令会生成test.wixobj文件,其实该文件仍然是XML格式,把它理解为中间态的目标文件就行。
light.exe -ext WixUIExtension test.wixobj
light命令会将中间态的目标文件转化成安装包,上述命令会生成test.msi文件。(由于使用了WIXUI,所以要加上 -ext WixUIExtension 参数)
candle和light相当于执行编译和链接操作。
至此,一个简单的安装程序就制作完成了。