在主版本升级期间,wix安装程序如何降级合并模块文件



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

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

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

在我看来,解决这个问题的最好方法是将标准操作"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文档将为您提供足够的详细信息。

如果你想知道是否可以反对微软推荐的RemoveExistingProducts的位置,请查看:

MajorUpgrade中的降级文件

顺便说一下,我过去曾与微软支持人员讨论过在花费成本使升级工作成功之前使用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.

如果emus不起作用,试试用amus。使用amus充满了风险,在大多数情况下应该避免,除非在特殊情况下。

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

但是,这里还是要小心。

REINSTALLMODE是调用者属性,通常由执行安装的人设置,因此在Property表中创建它不是一个好做法。

但是,可能会有特殊情况,例如您的情况,可能需要您采用此方法。

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

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

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

相关内容

  • 没有找到相关文章

最新更新