我有一个应用程序,我们正在切换到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" />
因为那是它所指的副本。完成后,安装程序工作,旧版本不能再安装在新版本之上。
过去的期货包
:您无法更改旧版本的包来检测较新版本的包。您需要从一开始就在包中构建保护。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 服务器不能从两个不同的位置注册 - 如果您使用正常的注册表注册(不过您可以使用基于清单的无注册 COM - 尽管有时会涉及这一点(。在应用程序支持并行安装之前,可能需要克服许多挑战,或者如果您的包很简单,没有注册表参与,则可能相当微不足道。
组件 GUID:除了提到的升级代码更改之外,您还需要为所有组件设置新的组件 GUID,以便真正保护产品彼此。如果您使用 WiX 自动 GUID,这将神奇地自动发生。尝试使用新组件 GUID 的原因解释如下:在 wix 中更改我的组件 GUID?实质上,GUID 引用计算绝对安装位置,而不是文件本身。安装到新位置,需要新的组件 GUID。