1

我有一个我们正在切换到 WiX 安装程序的应用程序。到目前为止,几乎一切似乎都进展顺利。我遇到的一个问题是,如果下载并尝试安装旧版本,它就会这样做。

这有点问题。如果安装了新版本,我不希望它安装旧版本。我认为问题出在“升级”组件上,但我必须承认我碰壁了。如何更改它以便旧版本看到已经安装了较新版本而不安装它?

我的测试产品现在是 2.4 版(我们正在尝试推出的最新版本)。它正确升级到 2.4.1 或 2.5 或 3.0。但是如果我制作一个 3.0 版本,然后运行 ​​2.4 的 msi,它仍然会添加它。

我的升级组件:

<Upgrade Id="PUT-GUID-HERE">
  <UpgradeVersion Maximum="2.4" Property="PREVIOUSVERSIONSINSTALLED" />
  <UpgradeVersion Minimum="1.0" Property="NEWERPRODUCTFOUND" OnlyDetect="yes" IncludeMinimum="no" />
</Upgrade>

跟进:
在遵循 Steins 的建议后,我收到类似
“重复符号 'WixAction:InstallExecuteSequence/RemoveExistingProducts' 找到”
的错误 在查看 Product.wxs 文件后,<InstallExecuteSequence>我不得不删除<RemoveExistingProducts Sequence="6550" />它,因为这是它所指的重复项。这样做之后,安装程序工作并且旧版本不能再安装在新版本之上。

4

1 回答 1

3

过去的期货包:您不能更改旧版本的包来检测新版本。你需要从一开始就在你的包中建立保护。Packages need to be pre-cognitive. It's an industry problem.

摩登时代:您在上面显示的 WiX 元素是“老式”的。这里描述了一个新的“便利功能”:如何在每次启动时检测已安装的产品版本?它涉及“新的” MajorUpgrade 元素。这个新的MajorUpgrade 元素具有一些自动魔法,我相信它会添加您默认描述的保护(降级保护)。因此,您可以切换到使用它。我会先试试。让我内联基本标记:

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

除了删除旧式升级元素外,还请记住删除RemoveExistingProducts标准动作的任何硬编码调度。例如,删除这一行(序列号可能不同,但名称相同):

<RemoveExistingProducts Sequence="6550" />

解耦:如果您发现人们运行旧版本并弄乱您的最新应用程序的风险很高,您可以为最新版本设置新的安装位置和新的升级代码并并排安装以解耦您的新旧产品。

并排:为此,您的产品必须能够和平共存,并且不会因文件关联、每台机器注册的 COM 服务器或其他使产品相互干扰的全球共享数据而争吵. 这是否可能取决于您的应用程序。全局共享的 COM 服务器不能从两个不同的位置注册 - 如果您使用正常的注册表注册(尽管您可以使用基于清单的无 reg-free COM - 尽管有时会涉及到)。在您的应用程序支持并行安装之前,可能需要克服许多挑战,或者如果您的包很简单而没有注册表参与,这可能是相当微不足道的。

组件 GUID:除了提到的升级代码更改之外,您还需要为所有组件设置新的组件 GUID,以便真正保护产品之间的相互隔离。如果您使用WiX 自动 GUID,这将自动神奇地发生。此处尝试解释您需要新组件 GUID 的原因:在 wix 中更改我的组件 GUID?本质上,GUID 引用计算的是绝对安装位置,而不是文件本身。您安装到一个新位置,您需要一个新的组件 GUID。

于 2018-06-28T00:55:37.547 回答