杉宫竹苑工作室

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2954|回复: 0

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

[复制链接]
发表于 2017-4-8 14:01:21 | 显示全部楼层 |阅读模式

正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

步骤1:添加版本升级所需的信息
为了允许重要升级,你需要在.msi中包含以下几个信息:

为产品添加唯一ID,以此标识产品可以升级
要完成此操作,你需要在Product元素中添加UpgradeCode属性。如下所示:
  1. <Product Id="*"
  2.         UpgradeCode="PUT-GUID-HERE"
  3.         Name="My Application Name"
  4.         Language="1033"
  5.         Version="1.0.1"
  6.         Manufacturer="My Manufacturer Name"/>
复制代码

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

MajorUpgrad元素参考:原文:MajorUpgrade Element
  1. <MajorUpgrade
  2.     DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit.">
复制代码

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

默认情况下,MajorUpgrade是在InstallValidate之后执行RemoveExistingProducts。你可以使用Schedule属性更改计划。例如,如果你选择在Inst
allInitialize之后执行它,代码配置如下:
  1. <MajorUpgrade
  2.     Schedule="afterInstallInitialize"
  3.     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操作调用的卸载中操作。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SgzyStudio

GMT+8, 2024-4-28 02:42 , Processed in 0.114643 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表