0

我们有一个使用合并模块的安装程序。合并模块的最新版本包括对某些文件的降级。使用安装程序从早期版本升级时,我们在降级这些文件时遇到问题。

最初合并模块中的文件被删除并且没有重新安装,但是在阅读wix 主要升级后没有安装Schedule='afterInstallFinalize'MajorUpgrade元素上设置的所有文件。这导致具有较新版本的文件被保留。

我们如何更改我们的安装程序或合并模块,以便在升级期间降级这些文件?

4

1 回答 1

1

好吧,在我看来,解决此问题的最佳方法是将标准操作“RemoveExistingProducts”排序到 CostInitialize 标准操作之前。请注意,此计划不符合 Microsoft 在以下位置的建议:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa371197(v=vs.85).aspx

因此,当您尝试构建您的 msi 包时,您可能最终不得不抑制 ICE 错误消息,如果不抑制,可能会阻止您构建。有一种简单的方法可以抑制 Wix 中的 ICE 错误消息。您可以在 Visual Studio IDE 中执行此操作,也可以在使用 candle.exe 编译您的 .wxs 项目时执行此操作。Wix 文档将为您提供有关此的足够详细信息。

如果您想知道是否可以违背 Microsoft 推荐的 RemoveExistingProducts 放置位置,请查看:

MajorUpgrade 中的降级文件

FWIW,我过去曾与 MS 支持人员谈过关于在成功升级成本之前有 REP 的问题,当时他们说没关系,同时指出它也在 MigrateExistingFeatures 之前,所以如果你在升级期间迁移功能有'会是个问题。

这意味着,如果您的 msi 包中有多个功能,并且您希望升级包升级完全相同的功能集,那么这种方法可能不起作用。但是,如果您的 msi 包中只有一个功能,那么这种方法将有效。

此外,请注意,将 RemoveExistingProducts 放在 InstallInitialize 和 InstallFinalize 之外会产生其他后果,以防升级期间出现错误,因为 RemoveExistingProducts 未进行交易。

可能发生的情况是,RemoveExistingProducts 将卸载您的旧应用程序,然后升级过程开始安装您的产品的较新版本。但是,此时,如果在安装较新版本的产品时发生错误,则升级会回滚,然后您的系统上将没有产品版本。

http://blogs.msdn.com/b/heaths/archive/2010/04/09/major-upgrades-with-shared-components.aspx

- 另一个选项是使用 REINSTALLMODE 属性。您将在属性表​​中使用 emus REINSTALLMODE = emus 值创作此属性。

如果鸸鹋不起作用,请尝试使用amus。 使用 amus 充满风险,应尽量避免,除非在特殊情况下。

https://msdn.microsoft.com/en-us/library/aa371182(v=vs.85).aspx

但是,在这里再次谨慎行事。

REINSTALLMODE 是调用者属性,通常由执行安装的人设置,因此在属性表中编写它不是一个好习惯。

但是,可能存在像您这样的特殊情况,可能需要您采用这种方法。

- 我正在考虑的另一个选项是更改合并模块中组件的组件 GUID。但是,这样做只有在满足以下条件时才有效:

- 您的合并模块的所有消费者都在升级周期的早期对 RemoveExistingProducts 进行了排序,即他们遵循 ugprade 方法,卸载旧产品并安装新产品。因此,这可能会导致所有消费者中的 RemoveExistingProducts 重新排序。

原因是,假设您在当前版本的合并模块中更改了组件 GUID,然后使用此合并模块重建最新版本的安装程序。如果 RemoveExistingProducts 在升级周期的后期进行排序,即在 InstallFinalize 之后,则违反了 Windows 安装程序组件规则。您有两个产品将相同的文件安装到相同的位置,但具有不同的组件 GUId。因此,如果遵循这种方法,RemoveExistingProducts 在升级周期的早期就被排序是绝对关键的。

希望这可以帮助。

于 2015-08-14T06:10:15.480 回答