[译]:WiX Toolset使用技巧——实现安装包重要升级

标签: WiX Toolset, 官方教程, 中文翻译

博客分类: 官方教程

返回目录索引
原文地址:Implement a Major Upgrade In Your Installer
译文地址:WiX Toolset使用技巧——实现安装包重要升级

How To: Implement a Major Upgrade In Your Installer

在我们创建基于.msi的安装程序时,强烈建议在Windows安装程序中添加支持重要升级的逻辑。重要升级是.msi最常见的更新形式,并且在初始.msi版本中提供 支持的话,可以使得你在未来获得更大的灵活性。如果没有针对主要升级的支持,那么如果你以后需要发布更新,这将会大大增加你分发软件的复杂性。关于Windows安装程序的重要升级其他内容可以参见:Major Upgrades —— 微软英文文档

你可以按照以下步骤学习如何在.msi中启用重要升级,如何生成多个.msi版本,并使用它们测试重要升级方案。

步骤1:添加版本升级所需的信息

为了允许重要升级,你需要在.msi中包含以下几个信息:

为产品添加唯一ID,以此标识产品可以升级

要完成此操作,你需要在Product元素中添加UpgradeCode属性。如下所示:

<Product Id="*"
        UpgradeCode="PUT-GUID-HERE"
        Name="My Application Name"
        Language="1033"
        Version="1.0.1"
        Manufacturer="My Manufacturer Name"/>

删除旧版本以及处理乱序安装

MajorUpgrade元素将升级所有旧版本的.msi。默认情况下,它可以防止乱序安装:在安装新版之后安装旧版。

MajorUpgrad元素参考:原文:MajorUpgrade Element

<MajorUpgrade
    DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit.">

有几个选项控制在哪些地方执行RemoveExistingProducts操作来移除旧版的.msi。你需要查看选项内容,并选择最适合的选项。关于选项内容可以参阅:原文:RemoveExistingProducts Action原文:RemoveExistingProducts Element

默认情况下,MajorUpgrade是在InstallValidate之后执行RemoveExistingProducts。你可以使用Schedule属性更改计划。例如,如果你选择在InstallInitialize之后执行它,代码配置如下:

<MajorUpgrade
    Schedule="afterInstallInitialize"
    DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit.">

Windows安装程序会在FindRelatedProducts操作期间查找具有相同UpgradeCode值的其他已安装的.msi文件。如果你没有在你的安装代码中指定FindRelatedProducts操作,WiX在创建.msi时会自动安排它。

步骤2:构建.msi —— 版本1和2 —— 用于测试

创建版本1的.msi与运行标准构建过程一样 —— 使用WiX toolset编译链接它。而创建版本2的.msi必须进行以下内容调整设置,然后再重新运行构建过程来创建新的.msi:

  • 增加Product元素中的版本号,要比以前发布的任何版本都高。Windows安装在升级方案中仅使用版本的前3个部分,因此确保增加你的版本 —— 前3个部分中的一个高于任何之前发布的版本。例如,如果你版本1使用版本号1.0.1.0,则版本2中应该使用1.0.2.0或更高版本(1.0.1.1在此处不起作用)

    注意:经测试,如果你使用版本号最后一位作为升级标识,要么安装不上,要么就是安装后出现两个版本,无法正确升级。

  • 在.msi的新版本的Product元素中生成新的Id值。

步骤3:在发布版1之前测试升级方案

这个步骤很重要,但常常会被忽略。为了确保升级方案可行(符合要求),你应该在发布第一版的.msi之前测试升级。如果有一些与升级相关的错误,可以通过版本2或更高版本的.msi来进行修复,但是如果有影响版本1的卸载的错误,则必须在发布版本1之前修复。一旦版本1发布,你基本上就锁定了与版本1一起发布的卸载行为,并且这会影响重要升级方案,因为Windows 安装程序在执行 版本2安装之前需要卸载版本 1。

这里有些有趣的场景测试:

  • 先安装版本1,后安装版本2.确保版本1正确删除,版本2正常工作。确保版本2在之后可以完全卸载干净。
  • 先安装版本2,然后尝试安装版本1。确保版本1检测到版本2安装,并且阻止或静默退出 —— 具体取决于你为乱序安装方案选择的执行行为。

在测试重要升级的场景中,你需要特别注意.msi中的自定义操作条件,因为自定义操作可能在重要更新的卸载操作中带来问题,并且可能导致你的产品只能部分安装。UPGRADINGPRODUCTCODE属性可用于防止由RemoveExistingProducts操作调用的卸载中操作。

另外,请注意需要安装到GAC或Win32 WinSXS存储的程序集。关于重大升级中移除GAC和WinSXS存储中的程序集的事件序列信息见:使用 Windows 安装程序程序包执行重大升级后缺少程序集在全局程序集缓存或 SxS


译:奇葩史

没有评论