我们有一个使用合并模块的安装程序。最新版本的合并模块包括降级到一些文件。当使用安装程序从早期版本升级时,我们在降级这些文件时遇到问题。
最初,合并模块中的文件将被删除且不会重新安装,但在读取wix major upgrade not installing all files之后,我在MajorUpgrade元素上设置了Schedule='afterInstallFinalize'。这导致具有较新版本的文件被保留。
我们如何更改安装程序或合并模块,以便这些文件在升级期间被降级?
发布于 2015-08-14 14:10:15
嗯,在我看来,解决这个问题的最好方法是将标准操作"RemoveExistingProducts“排序到CostInitialize标准操作之前。请注意,此计划不符合Microsoft的建议,网址为:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa371197(v=vs.85).aspx
因此,当您尝试构建msi包时,您可能最终必须取消ICE错误消息,如果不取消ICE错误消息,可能会阻止您构建。有一种简单的方法可以在Wix中抑制ICE错误消息。您可以在Visual studio IDE中以及在使用candle.exe编译.wxs项目时执行此操作。Wix文档将为您提供有关这方面的足够详细信息。
如果你想知道是否可以违背微软为RemoveExistingProducts推荐的位置,看看:
Downgrade File in MajorUpgrade
顺便说一句,我过去曾和微软的支持人员谈过,让他们在花费成本之前让升级成功,当时他们说这没问题,同时指出,这也是在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的其他选项是使用-The属性。您将在property表中使用emus REINSTALLMODE = emus值创建此属性。
如果emus不起作用,试试amus。使用amus的充满了风险,应该在大多数情况下避免使用,除非在特殊情况下。
https://msdn.microsoft.com/en-us/library/aa371182(v=vs.85).aspx
但是,在这里再次保持谨慎。
REINSTALLMODE是调用者属性,通常由执行安装的人员设置,因此在属性表中编写它不是一种好的做法。
但是,可能会有像您这样的特殊情况,这可能需要您采取这种方法。
-The我考虑的另一个选择是更改合并模块中组件的组件GUID。但是,只有在满足以下条件的情况下,才能执行此操作:
-All你的合并模块的使用者在升级周期的早期就已经进行了RemoveExistingProducts排序,也就是说,他们遵循了一种ugprade的方法,卸载旧的产品,然后安装新的产品。因此,这可能会导致所有消费者中的RemoveExistingProducts重新排序。
原因是,假设您在合并模块的当前版本中更改了组件GUID,然后使用此合并模块重新构建最新版本的安装程序。如果在升级周期的后期(即InstallFinalize之后)对RemoveExistingProducts进行排序,则违反了windows installer组件规则。您有两个产品将相同的文件安装到相同的位置,但具有不同的组件GUId。因此,如果遵循此方法,则在升级周期的早期对RemoveExistingProducts进行排序是绝对关键的。
希望这能有所帮助。
https://stackoverflow.com/questions/31886450
复制相似问题