WiX“重大升级”不会在降级时完全安装应用程序

Posted

技术标签:

【中文标题】WiX“重大升级”不会在降级时完全安装应用程序【英文标题】:WiX "Major Upgrade" doesn't completely install app on downgrade 【发布时间】:2010-12-05 10:10:57 【问题描述】:

目前,只要更新到较新的版本号,所有升级都可以正常工作,但是在降级时我会遇到奇怪的行为。似乎它会卸载现有版本,然后部分安装我要安装的版本,目标位置中尚不存在主 exe,但创建了宣传的快捷方式。当宣传的快捷方式打开时,它会完成安装(大概是进行修复),然后它会运行良好。

有人知道为什么会这样吗?

我的升级块如下所示:

<UpgradeVersion Minimum="0.0.0.0" Maximum="99.0.0.0" Property="PREVIOUSVERSIONSINSTALLED" IncludeMinimum="yes" IncludeMaximum="no" IgnoreRemoveFailure="yes" />

(IgnoreRemoveFailure 试图解决这个问题,但它似乎没有做任何事情)

在我的 InstallExecuteSequence 我有<RemoveExistingProducts After="InstallValidate" />

我还有Product Id="*"Package Id="*"

之所以需要降级是因为客户端应用程序需要运行与服务器相同的版本以确保兼容性,并且整个过程需要自动化,因此如果客户端/服务器版本在登录时不匹配用户只需单击“是”即可下载、安装和启动正确的版本。到目前为止,这适用于升级,但对于降级,需要一个额外的不直观的步骤,即手动重新启动应用程序,然后在启动之前看到一个 Windows 安装程序对话框。

最终的结果是,无论升级还是降级,都需要完全卸载当前版本,并完全安装下载的版本,所以如果有其他方法可以做到这一点,那也是一个很好的答案。

【问题讨论】:

即使在今天,我也有无穷无尽的问题。 WiX 添加了一个新的“MajorUpgrade”元素,它应该让事情更难出错。我们现在正在使用它,但即便如此,降级也存在与以前相同的问题。现在的不同之处在于它消除了几个罪魁祸首:(1) InstallExecuteSequence (2) UpgradeVersion 元素。 【参考方案1】:

这对我有用:

<Wix ...>
  <Product ...>
    <Property Id="REINSTALLMODE" Value="amus" />
    <MajorUpgrade AllowDowngrades="yes" />

【讨论】:

这应该是公认的答案。这也对我有用,尽管我使用“dmus”而不是“amus”来仅在版本不同时覆盖文件。完整的标志列表:msdn.microsoft.com/en-us/library/…【参考方案2】:

允许降级并不被认为是最佳做法,至少部分原因是很难测试您将支持的每个组合,而仍然可以修复它们。是不是检测并屏蔽这种情况不可行(建议先删除较新的版本),只自动支持前进?

如果您必须让这一项工作,那么在详细日志中是否有任何内容用于降级安装(或用于修复 - 您需要设置机器的日志记录策略才能创建此一项),以确认主要升级(我会在 FindRelatedProducts 附近查看)或讨论为什么未安装您的 exe 组件?一定要检查带有SELMGR 的任何日志行,因为它们可能会在较小的升级方案中解释这一点。

由于有广告的快捷方式,听起来好像是广告的组件。这可能表明在次要升级中违反了组件规则(特别是在较新版本中添加组件,看起来就像在旧版本中删除 - 请参阅 HeathS 的 commentary)尽管看起来 Product/@Id='*' 应该强制进行重大升级。

您也可以尝试在示例项目中工作,从具有单一功能、单一组件和带有快捷方式的单一文件的基本版本开始。如果相关,将另一个组件和文件添加到升级版本;否则只是增加文件版本。然后尝试您的相反方案。慢慢添加东西,直到找到罪魁祸首。然后希望它是您可以从您的真实产品中删除的东西,或者可以通过其他方式解决。

【讨论】:

【参考方案3】:

我的建议是“让它工作”方面的一点点 - 您可以尝试在降级的情况下静默修复自定义操作。

【讨论】:

我找不到如何将维修安排为自定义操作。你有任何描述这个的链接吗? 我正在考虑使用 msiexec 运行自定义操作并使用您的 msi 作为源 (msiexec /fa prod.msi /qn) 我不确定您是否可以同时运行多个 Windows 安装程序实例。在这种情况下会有两个。一个从另一个内部执行。 嗯...现在我想起来了.. MSI 永远不会由最终用户直接运行,它总是通过某种引导程序来安排,所以我认为我可以完成这项工作。如果是这种情况,将尝试标记为已接受。【参考方案4】:

您是如何对 InstallExecuteSequence 中的操作进行排序的?

如果您在安装后执行卸载(这为您提供最佳升级性能),您可能会在文件版本更改为较低版本时遇到问题;降级时可能就是这种情况。

除非明确要求,否则 Windows 安装程序不会用新版本覆盖旧版本。

如果是这种情况,在安装前重新排序以卸载应该会有所帮助。

【讨论】:

在安装前先卸载。之前升级时遇到过这个问题,直到我重新安排它。现在它适用于升级,但仍然存在降级问题【参考方案5】:

如果您使用两个“UpgradeVersion”元素会发生什么?

<UpgradeVersion Maximum="CurrentVersion" Property="PREVIOUSVERSIONSINSTALLED" IncludeMaximum="no" />
<UpgradeVersion Minimum="CurrentVersion" Property="PREVIOUSVERSIONSINSTALLED" IncludeMinimum="no" />

【讨论】:

以上是关于WiX“重大升级”不会在降级时完全安装应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Wix 重大升级,无论文件版本较新,都替换文件

如何使用 WiX 从源代码重建完全相同的 msi 文件?

如何实现 WiX 安装程序升级?

WIX安装项目未完全卸载应用程序

如何在 Wix 的重大升级中让 PathwaysMDF 和 LDF 覆盖旧副本?

WIX:安装应用程序的多个实例并升级应用程序(如果安装在以前安装的位置)