Fork me on GitHub

使用WiX制作简单MSI安装程序

WiX完全用xml描述,使用命令行来生成。只要用任何一个文本编辑器就可以了。但是为了开发效率,我们还是借助于辅助工具比较好。是一般使用的工具是两个:一个Visual Studio插件,在WiX的安装包里面附带,另一个就是WiXEdit,WixEdit是编辑的XMLXML的源代码的图形化工具箱.WixEdit会让你创造体制条件与MSI和MSM测试wix工具箱.它提供了直观的、轻松的对话方式编辑wix文件来源。

下载和安装

1、下载Wix 3.0版本,目前还是beta。但是已经足够稳定了,可以应用于生产环境。

2、下载WixEdit

在安装完WiX之后在Visual Studio上有几个WiX的模板,我使用的是Visual Studio 2008,看起来是这个样子的。

wixTemplates 

创建一个新的WiX项目

1、文件--〉新建--〉项目

2、选择项目类型WiX,选择Wix项目模板点击确定

我们就创建了一个没有安装什么内容的WiX项目,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="77da05c4-1644-4bc3-ac14-c0f721fe31fe" Name="WixProject1" Language="1033" Version="1.0.0.0" Manufacturer="WixProject1" UpgradeCode="a897ccc5-1c81-47e0-a837-65c07a72a7bc">
        <Package InstallerVersion="200" Compressed="yes" />

        <Media Id="1" Cabinet="WixProject1.cab" EmbedCab="yes" />

        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
                <Directory Id="INSTALLLOCATION" Name="WixProject1">
                    <!-- TODO: Remove the comments around this Component element and the ComponentRef below in order to add resources to this installer. -->
                    <!-- <Component Id="ProductComponent" Guid="fc46b1a2-35e9-4a17-896b-80b2daaae567"> -->
                        <!-- TODO: Insert files, registry keys, and other resources here. -->
                    <!-- </Component> -->
                </Directory>
            </Directory>
        </Directory>

        <Feature Id="ProductFeature" Title="WixProject1" Level="1">
            <!-- TODO: Remove the comments around this ComponentRef element and the Component above in order to add resources to this installer. -->
            <!-- <ComponentRef Id="ProductComponent" /> -->
        </Feature>
    </Product>
</Wix>

<Wix/>元素是WiX安装程序的根,Product元素是我们的主角,只有一个Product元素,它要求有一个唯一的GUID和一个区域设置 ID(LCID 缺省时美国英语,1033)和upgradecode。产品名称(Name), 制造商(manufacturer), 和版本(version)是必须的。在 WiX 帮助文件的 WiX 架构部分中查看“Product 元素”页。如果向下滚动到“属性”部分,您可以看到为 Product 元素定义的属性,其中包括必需的属性。因此,可以证明 WiX 示例代码确实提供了 Product 元素需要的所有属性。

表 1 — Product 元素属性(部分列表)

名称

类型

说明

必需

Id

Autogenuuid

产品的产品代码 GUID。

语言

LocalizableInteger

产品的十进制语言 ID (LCID)。

制造商

字符串

产品制造商。

名称

字符串

产品的描述性名称。

版本

字符串

产品的版本字符串。

 

< Package\ > 元素是 Product 元素和 Module 元素的必需子元素。该包介绍了作为部分 .msi 摘要流提供的属性,在资源管理器中将鼠标停留在 .msi 上方时就会看到这些属性。

查看 WiX 帮助文件文档中 Package 元素的其他可用属性。请注意,我们可以指定安装程序版本、文件压缩,甚至安装权限(如果面向 Windows Vista)。

表 2 — Package 元素属性(部分列表)

名称

类型

说明

必需

Id

Autogenuuid

SKU 的程序包代码 GUID。

AdminImage

YesNoType

如果源是管理映像,则设置为“是”。

 

注释

字符串

可选注释(用于浏览)。

 

压缩

YesNoType

如果设置为“是”,则源中可包含压缩文件。

 

说明

字符串

产品的完整名称或说明。

 

InstallerVersion

整数

最低安装程序版本(最大数*100 + 最小数)。

 

InstallPrivileges

枚举

通过此属性指定在 Windows Vista 或更高版本上安装此程序包所需的权限。此属性的值应为下列值之一:

受限

设置为此值表明该程序包无需提升权限即可安装。

提升

设置为此值表明该程序包需要提升权限才能进行安装。此为默认值。

 

制造商

字符串

发布此包的供应商。

 

平台

字符串

此程序包支持的平台列表。

 

 

对于许多安装程序(例如本示例),最好在 MSI 中将所有安装源文件打包在一起。通过 Media 元素,我们只需指定希望将文件存储到压缩和嵌入式 .cab 文件即可。但是,更大的安装程序可能需要跨多个磁盘。在这种情况下,您需要在 WiX 源文件中定义多个 Media 元素,并根据需要将资源分配到每个磁盘中。

表 3 — Media 元素属性(部分列表)

名称

类型

说明

必需

Id

整数

Media 表的磁盘标识符。此数值必须等于或大于 1。

Cabinet

字符串

Cabinet 的名称(如果将存储在媒体上的部分文件或所有文件都压缩到了 Cabinet 文件中)。如果未使用任何 Cabinet,此属性必须为空。

 

DiskPrompt

字符串

磁盘名称,通常是磁盘上印刷的可见文本。此文本可本地化,用于提示用户何时需要插入此磁盘。此值将用于 DiskPrompt 属性的“[1]”中。使用此属性需要定义 DiskPrompt 属性。

 

EmbedCab

YesNoType

如果设置为“是”,则指示活页夹将 Cabinet 嵌入到产品中。此属性只能与 Cabinet 属性一起指定。

 

VolumeLabel

字符串

该标签指示卷的属性。这是 GetVolumeInformation 函数返回的卷标。如果 SourceDir 属性指的是可移动(软盘或 CD-ROM)卷,则在尝试安装文件之前可通过此卷标验证驱动器中是否存在适当的磁盘。此列中的条目必须与物理媒体的卷标匹配。

 

 

随后是一组<Directiory/〉元素,最外面的又一个“Targetdir”,这是一个虚拟的dir,用于包含其它的Directory,第二个是一个标准的Windows安装目录,第三个就是程序的安装目录,可以通过修改它的Name来指定我们的程序想安装的目录。

在安装目录里面是Component元素,每一个Component就是一组我们要放置到WiX的资源,就是在这个地方放置我们的安装文件。

Feature元素描述了一个安装元素,这里可能有很多的Feature元素,但是每一个Feature元素内部必须包含一个Component元素。

Feature/Component的关系甚至可以更复杂。因为<Component/>中的某些元素,比如<Shortcut/>,包含指向与Component关联的Feature的引用。这种来自<Component/>子元素的引用,被称作反向引用,有时也称作feature backlinks。复杂引用和反向引用的处理,可能是链接程序必须实现的最难的工作。

下面我们来自定义一个安装程序。

添加安装的图形界面
WiX的安装界面使用的是命令行模式,我们现在在增加一个图形的安装界面。WiX 3的图形界面在一个WixUIExtension里面定义,WixUI对话框库包含一套"stock"多话框,用来提供wizard风格的安装用户界面。用一个UIRef为安装包添加一个界面。WixUI可以自定义,比如在界面上显示图片或者添加、删除某个界面。WixUI对话框组件支持4种通用对话框序列:
  • WixUI_Mondo :包括整套对话框:welcome, license agreement, setup type (typical, custom, and complete), feature customization, directory browse, 和 disk cost。也包括Maintenance-mode对话框。当产品的某些特性在默认情况下不安装,或者典型安装和完全安装有很大不同时,使用WixUI_Mondo。
  • WixUI_FeatureTree :是WixUI_Mondo的简单版本。它去掉了setup type对话框。用户直接从许可协议界面进入feature customization界面。当默认情况下安装全部特性时,WixUI_FeatureTree比WixUI_Mondo更合适。
  • WixUI_InstallDir :不允许用户选择features, 但允许选择安装路径。
       Note: 要使用WixUI_InstallDir,你必须为WIXUI_INSTALLDIR设置一个值,该值由Directory的Id确定,作为初始的安装路径。
  • WixUI_Minimal :最简单的WixUI组件类型。唯一的界面组合了welcome 和 license-agreement对话框,去掉了feature customization对话框。当产品没有可选特性时,WixUI_Minimal是合适的。
  • WixUI_Advanced:可以对所有的对话框进行定义
  • 使用Visual Studio 的项目模板非常的简单,按照下序步骤就可以完成,下面以WixUI_InstallDir 来说明:

    1、添加WixUIExtension.dll的引用

    2、添加下列两行代码到Product.wxs文件就可以了

          <Property Id="WIXUI_INSTALLDIR" Value="INSTALLLOCATION" />
          <UIRef Id="WixUI_InstallDir" />
    

    添加我们的安装文件

    Visual Stuido的WiX模板有智能感知,但是还是只能一行一行的敲代码,我们可以借助于WixEdit来完成这个工作。

    wixEditFiles

    编译和安装

    使用Visual Studio编译项目,运行安装程序测试一下。

     

    posted @ 2008-12-14 17:39  张善友  阅读(7265)  评论(1编辑  收藏  举报