我们有一个使用合并模块的安装程序。最新版本的合并模块包括降级到某些文件。使用安装程序从早期版本升级时,我们在降级这些文件时遇到问题。
最初合并模块中的文件已被删除而未重新安装,但在阅读wix major upgrade not installing all files后,我在Schedule='afterInstallFinalize'
元素上设置了MajorUpgrade
。这导致保留了具有较新版本的文件。
我们如何更改安装程序或合并模块,以便在升级过程中降级这些文件?
答案 0 :(得分: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展示位置,请查看:
Downgrade File in MajorUpgrade
FWIW,我过去曾与MS支持谈过在成本升级成本之前使用REP,当时他们说没关系,同时指出它也在MigrateExistingFeatures之前,所以如果你在升级过程中迁移功能会出现问题。
这意味着,如果您的msi包中有多个功能,并且您希望升级包升级完全相同的功能集,则此方法可能无效。 但是,如果你的msi包中只有一个功能,那么这种方法就可以了。
另外,请注意,如果在升级过程中出现错误,则将InstallExistingProducts放在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是调用者属性,通常由执行安装的人员设置,因此在Property表中创建它不是一个好习惯。
但是,可能会出现诸如你的特殊情况,这些情况可能需要您采用这种方法。
- 我想的另一个选择是更改Merge模块中组件的组件GUID。 但是,这样做只有在满足以下条件时才有效:
- 合并模块的所有使用者都在升级周期的早期对RemoveExistingProducts进行了排序,即他们遵循ugprade的方法,其中卸载了旧产品并安装了较新的产品。 因此,这可能会导致您所有消费者对RemoveExistingProducts进行重新排序。
原因是,假设您更改了当前版本的合并模块中的组件GUID,然后使用此合并模块重建最新版本的安装程序。如果RemoveExistingProducts在升级周期的后期排序,即在InstallFinalize之后,那么它违反了Windows安装程序组件规则。您有两个产品将相同的文件安装到同一位置但具有不同的组件GUId。因此,绝对关键的是,如果遵循这种方法,RemoveExistingProducts会在升级周期的早期对其进行排序。
希望这有帮助。