最近研究了一下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 工具集有两种使用方式:一种是集成为 Visual Studio 的一部分,以便直接在 Visual Studio IDE 中生成 WiX 项目。VS扩展程序也可在官网下载。 另一种是在命令行上使用 WiX 工具。本文仅介绍WIX在命令行上的使用。
  WiX 的源代码是使用 XML 格式编写的,后缀名一般为 .wxs。该文件相当于安装包的描述文件,描述了软件的安装信息,包括GUID、版本号、功能模块、安装文件及路径等等。安装包的生成过程类似于源代码生成可执行程序的过程,经历预处理、编译与链接。

初识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:支持防降级安装  
    • 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为初始安装路径,并允许用户修改
  • 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相当于执行编译和链接操作。

  至此,一个简单的安装程序就制作完成了。

WiX 简介的更多相关文章

  1. Wix学习整理(1)——快速入门HelloWorld

    原文:Wix学习整理(1)--快速入门HelloWorld 1 Wix简介 Wix是Windows Installer XML的简称,其通过类XML文件格式来指定了用于创建Windows Instal ...

  2. Wix打包系列(一)如何使用wix制作安装程序

    原文:Wix打包系列(一)如何使用wix制作安装程序 最近由于项目需要,需要给客户制作安装程序,一开始使用vs2005自带的打包工程来打包,但用了一段时间发现vs打包太死板,而且使用起来问题很多.收费 ...

  3. WIX 学习笔记- 1 简介

    一个项目 Code Complete 后,程序员们欢欣鼓舞,以为事情到此结束,可以 Happy 了.其实 Code Complete 五十之于百里.一个没有运行在设备上,为人们创造价值的项目是注定失败 ...

  4. Wix学习整理(2)——HelloWorld安装添加UI

    原文:Wix学习整理(2)--HelloWorld安装添加UI 在前一篇随笔Wix学习整理(1)——快速入门HelloWorld中,我们制作的安装包安装界面太简单,没有与用户进行交互的过程.下面我们修 ...

  5. ASP.NET Core 1.1 简介

    ASP.NET Core 1.1 于2016年11月16日发布.这个版本包括许多伟大的新功能以及许多错误修复和一般的增强.这个版本包含了多个新的中间件组件.针对Windows的WebListener服 ...

  6. MVVM模式和在WPF中的实现(一)MVVM模式简介

    MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...

  7. Cassandra简介

    在前面的一篇文章<图形数据库Neo4J简介>中,我们介绍了一种非常流行的图形数据库Neo4J的使用方法.而在本文中,我们将对另外一种类型的NoSQL数据库——Cassandra进行简单地介 ...

  8. REST简介

    一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式.”但是在要求详细讲述它所提出的各个约束,以及如何开始搭建REST服务时,却很少有人能够清晰地说出它到底是什么,需要遵守什么样的准则. ...

  9. Microservice架构模式简介

    在2014年,Sam Newman,Martin Fowler在ThoughtWorks的一位同事,出版了一本新书<Building Microservices>.该书描述了如何按照Mic ...

随机推荐

  1. 优雅的创建一个JavaScript库

    这篇文章的目的是通过演示一个简单的例子来介绍在JS中实例化和定义一个库的正确方法,以优化他人编写或维护自己的JS库. 在我们深入之前,我做了两点假设: 你知道简单的JavaScript或C语言. 你不 ...

  2. php+mysql开发一个最简单的在线题库,在线做题系统!

    题库,对于教育机构,学校,在线教育,是很有必要的,网上也有不少的第三方在线题库系统,但是本次案例,会让有需要的人了解题库的开发思路,其实很简单,无非就是一个表单验证,数据库验证. 1.先构建表单数据2 ...

  3. 实验一 Linux系统与应用准备

    实验一 Linux系统与应用准备 项目 内容 作业归属 班级课程 作业要求 课程作业要求 学号-姓名 17041419-刘金林 作业学习目标 1.学习博客园软件开发者学习社区使用技巧和经验:2.学习M ...

  4. 快速上手 Python 命令行模块 Click

    关于Click? 说下 Click 模块是干啥的,简单说,它就是把我们的 Python 脚本的一些函数,通过 添加带有 Click 关键字的装饰器进行装饰进而将函数调用的形式转化为命令行传参的形式然后 ...

  5. 关于js拖放功能的实现

    这是具体的拖放代码的HTML,里面依赖两个组件:EventUtil.js是兼容浏览器添加方法的库,EventTarget.js是一个发布-订阅者模式的对象库. EventUtil.js: var Ev ...

  6. JavaScript对象(三)

    序列化对象: 对象序列化:对象的状态转化为字符串,也可以将字符串还原为对象.方法:JSON.stringify(),用来序列化,JSON.parse(),用来还原对象. JSON(JavaScript ...

  7. 3DGIS+BIM集成与智慧城市应用

    ZTMap3D是基于网络的三维地理信息系统平台软件,利用 ZTMap3D能够实现三维地理信息和虚拟现实,是数字化地球和数字化城市建设的基础平台. BIM(building information mo ...

  8. ARM AVI 视频播放 基于 2440 freambuffer 绘制

    AVI 文件格式 图解 整理: AVI 是一种容器,里面放什么格式的数据都可以 视频编码:格式可以是 H264, MPEG-4, MJPEG ,因为 MJPEG 比较简单,所以仅支持 MJPEG 的 ...

  9. vue中数据请求的三种方法

    注意请求可能存在跨域问题,需要去配置好 这三种建议使用axios 1.resource Vue 要实现异步加载需要使用到 vue-resource 库. Vue.js 2.0 版本推荐使用 axios ...

  10. golang的sync.WaitGroup使用示例

    下面一段代码 len(m) 不一定会打印为 10,为什么?.如果想要 len(m) 打印为 10,应该怎么修改代码? func main() { const N = 10 m := make(map[ ...