使用WiX打包你的应用程序之一---基本应用

很多从事开发的同行,在程序部署方面经常遇到这样一些问题:

  • 程序部署复杂,无法搞定,甚至于必须开发人员到现场去安装调试;
  • 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实践,将在这个系列后面几篇文章中一一讨论.

posted @ 2007-12-04 14:50  Jeffrey Sun  阅读(8180)  评论(5编辑  收藏  举报