我有一个要切换到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>
跟进:
遵循斯坦斯的建议后,出现了这样的错误
“找到重复的符号'WixAction:InstallExecuteSequence / RemoveExistingProducts'”
在<InstallExecuteSequence>
下的Product.wxs文件中浏览后,我不得不删除<RemoveExistingProducts Sequence="6550" />
,因为那是它所指的重复项。完成此操作后,安装程序将运行,并且旧版本无法再安装在新版本之上。
答案 0 :(得分:3)
过去的期货软件包 :您不能更改软件包的旧版本来检测较新的软件包。您需要从一开始就在包中建立保护。 Packages need to be pre-cognitive. It's an industry problem.
现代时代 :您上面显示的WiX元素是“旧样式”。这里描述了一个新的“便利功能”: How do you detect installed product versions at each startup? ,它涉及“新” MajorUpgrade element。这个新的MajorUpgrade element具有一些自动魔术功能,我相信它会默认添加您描述的保护(降级保护)。因此,您可以切换到使用它。我会先尝试。让我内联基本标记:
<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的COM,但是您可以使用基于清单的COM)。在您的应用程序支持并行安装之前,可能有许多挑战需要克服,或者,如果您的程序包很简单且没有注册表的参与,那么这可能是微不足道的。
组件GUID :除了提到的升级代码更改之外,您还需要为所有组件设置新的组件GUID,以便真正屏蔽产品彼此。如果您使用WiX auto-GUIDs,这将自动发生。尝试尝试使用新组件GUID的原因在这里进行了解释:Change my component GUID in wix?本质上,GUID引用计算的是绝对安装位置,而不是文件本身。安装到新位置,需要新组件GUID。