很多从事开发的同行,在程序部署方面经常遇到这样一些问题:
- 程序部署复杂,无法搞定,甚至于必须开发人员到现场去安装调试;
- Visual Studio Deployment 项目难以使用及定制
- 使用Install Shield等比较费钱的工具(如果你爱使用盗版并且不介意在将来某个时候承受版权纠纷,那么这条不算).
- 甚至于没有安装包,显得很不正规(呵呵,我以前也这么干^_^)
如果你遇到这些问题,并且确定你是使用Microsoft家的Visual Studio系列IDE进行开发,那么我觉得有个很好的打包工具可以推荐给你: Windows Installer XML, 简称WiX.
WiX是Microsoft Corp.的Windows Team 的一个叫Rob Mensching的软件设计工程师(现在已经是高级软件设计工程师啦)在2000年设计的一个简单打包工具集合.到现在为止,稳定版本为2.0.5325.0,最新可用版本为3.0.2925.0. V3和V2的主要区别是针对任务结构和对VS的集成做了新的修改. 由于作者在实际的应用环境中,出于稳定性和减少因工具使用带来的bug这两个方面的考虑, 应用了V2 Stable作为打包工具集. 在这个系列文章中,也会使用该版本讲解. 实际V2和V3的差别,如果读者对V3很感兴趣,请自行研究,不再在本系列中详细对比.
请从这里下载WiX 2.0.5325.0
请从这里下载WiX 3.0.2925.0 ProjectAggregator2 3.0.2925.0
一个Windows安装文件(.msi files)在应用意义上来说可以说成是一个小型数据库,Windows Installer运行安装文件的安装过程,就是根据这个小型数据库的对应表的描述,讲对应文件拷贝到目标文件夹,修改指定文件内容, 修改对应注册表内容,修改系统服务等. 这个数据库是由几个主要表组成:
表名 | 主要用途 |
Direcotry表 | 规定目标的文件夹结构,Directory节点的嵌套结构就是Default路径. |
File表 | 规定想要被安装到目的地的文件, 在打包时从何处获取; |
Binary表 | 规定在安装过程中要使用的文件, 在打包时从何处获取; (区别于File) |
Component表 | 规定安装包内的基本组件结构,共同完成同一功能的文件及Action, 应归纳在一个Component节点下 |
Registry表 | 规定对注册表项的修改 |
Feature表 | Component的不同组合就是Feature; 允许用户定制安装不同组件. |
Dialog表 | 安装过程显示的窗体 |
CustomAction表 | 自定义的Action保存在这里 |
User表 | 定义操作系统的User(Windows) |
UserGroup表 | 定义操作系统的Group(Windows) |
Property表 | 定义在安装包内部使用的属性; 属性是用来传递信息的节点. |
IIS*表 | 进行IIS有关操作. |
XMLFile表 | 对XML或者类似文件中的某些节点进行修改的Action表. |
你可以使用Orca来打开任何一个msi文件查看以上内容^_^
一个简单的WiX文件(wixdemo.wxs)内容如下, 这个版本没有UI,有UI的版本请从我的SkyDrive下载:
1: <?xml version="1.0" encoding="utf-8"?>
2: <?define SOURCEDIR="C:/wixdemo"?>
3: <Wix xmlns="http://schmeas.microsoft.com/wix/2003/01/wi">
4: <Product Name="WixDemo" Id="904F998D-B3BE-4536-9ABE-F8B72B98BCEA" Language="1033" Version="1.0.0.0" Manufacturer="Wix Demo Corp.">
5: <Package Id="4DB93456-952B-4463-BFD0-86306D5C29D4" Keywords="Installer" Description="Our road to first wix installer" Comments="We will rock you" Manufacturer="Our Corp." InstallerVersion="100" Languages="1033" Compressed="yes" SummaryCodepage="1252" />
6: <Media Id="1" Cabinet="OMSimulator.cab" EmbedCab="yes" />
7: <Directory Id="TARGETDIR" Name="SourceDir">
8: <Directory Id="ProgramFilesFolder" Name="PFiles">
9: <!--Write a new key to registry on installation and remove it when unstallation-->
10: <Component Id="RegComponent" Guid="6EEBA57B-A0B0-4328-A414-931A14904913" DiskId="1">
11: <Registry Id="SignatureKey" Root="HKLM" Key="SOFTWARE/WixDemo/MySignature" Action="createKeyAndRemoveKeyOnUninstall" />
12: </Component>
13: <!--Target Directory: ProgramFile/Wix Demo Application-->
14: <Directory Id="WIXDEMO" Name="WixDemo" LongName="Wix Demo Application">
15: <!--File to be copied-->
16: <Component Id="WixApp" Guid="C03083B7-E539-47b3-84C6-88ED783A5C31">
17: <File Id="File_1" Name="Readme" LongName="Readme.txt" KeyPath="no" Compressed="yes" src="$(var.SOURCEDIR)/" DiskId="1"/>
18: </Component>
19: <!--File to be copied and configed-->
20: <Component Id="Config" Guid="DCACE815-3FEF-4f1d-8494-1F1877954578">
21: <File Id="File_2" Name="WebCon" LongName="Web.config" KeyPath="yes" Compressed="yes" src="$(var.SOURCEDIR)/" DiskId='1'/>
22: <XmlFile Id='ConnStrSet' File='[WIXDEMO]web.config' Action='setValue'
23: ElementPath="/configuration/connectionStrings/add[/[]@name='ConnectionString'[/]]/@connectionString"
24: Value="Data Source=[INSTANCE];Initial Catalog=[DEMODB];Connection Timeout=300;Integrated Security=SSPI;"
25: Sequence='1' />
26: <XmlFile Id='LogPathSet' File='[WIXDEMO]web.config' Action='setValue'
27: ElementPath="/configuration/appSettings/add[/[]@key='LogFilePath'[/]]/@value"
28: Value="[LOGPATH]"
29: Sequence='2' />
30: </Component>
31: </Directory >
32: </Directory>
33: </Directory>
34:
35: <Feature Id="DemoFeature" Title="This feature installs the components for WiX demo" Level="1">
36: <ComponentRef Id="RegComponent"/>
37: <ComponentRef Id="WixApp" />
38: <ComponentRef Id="Config" />
39: </Feature>
40:
41: <Property Id="INSTANCE" Value="." />
42: <Property Id="DEMODB" Value="WixDemoDB" />
43: <Property Id="LOGPATH" Value="c:/WixDemo/log" />
44: </Product>
45: </Wix>
保存为wixdemo.wxs到c:/wixdemo, 并我的skydrive里面的web.config, readme.txt, 使用命令
candle wixdemo.wxs
light wixdemo.wixobj sca.wixlib wixca.wixlib /out wixdemo.msi
之后就可以得到安装文件wixdemo.msi
这个demo的主要目的是演示文件拷贝, 文件内容根据特定指示修改, 在接下来的版本中会根据在安装时用户在ui中输入的信息更新配置文件.
Xpath的写法,IIS相关问题, UI相关问题,属性相关问题,自定义Action问题以及我的WiX实践,将在这个系列后面几篇文章中一一讨论.