2013-02-28 129 views
21

我有一个非常简单的安装某些文件(.NET程序版本6.0.0.0)的WiX项目(版本3.7)。我准备在WiX中使用MajorUpgrade功能发布新版本6.0.1.0。wix主要升级不安装所有文件

我保持的UpgradeCode的产品元素相同,我从6.0.0.0更改版本到6.0.1.0

<Product Id="*" Name="MyApp" Version="6.0.1.0" Manufacturer="Me" 
     UpgradeCode="$(var.TheUpgradeCodeGUID)"> 

在一台机器安装了6.0.0.0,我运行新的安装程序。

旧版本6.0.0.0的删除运行正常(所有安装的文件都被删除),但是当安装程序继续安装新版本时,会丢失2个文件:第三方DLL和第三方EXE没有被改变)没有被重新安装。

<Component Id="AutomaticUpdaterWPF.dll" Guid="*"> 
     <File Id="AutomaticUpdaterWPF.dll" Source="AutomaticUpdaterWPF.dll" KeyPath="yes" Checksum="yes" /> 
</Component> 
<Component Id="wyUpdaterProgram" Guid="*"> 
     <File Id="wyUpdaterProgram" Source="wyUpdate.exe" KeyPath="yes" Checksum="yes" /> 
</Component> 

中的所有其他文件< ComponentGroup>(一些修改,一些未经修饰的含其他第三方的DLL)是否被正确的重大升级期间安装。

如果在主要升级后点击“修复”,2个丢失的文件会重新出现。 另外,如果我第一次安装版本6.0.1.0(不升级,但首次安装在干净的机器上),那么这两个文件将直接正常安装。 (几个Windows机器上测试(XP,7,8)

任何人的任何建议,什么是错的,如何解决?

+0

您是否尝试过使用详细日志记录来运行安装,以了解它们未安装的原因? – ChrisPatrick 2013-02-28 15:06:03

+0

安装日志文件在这里:http://pastebin.com/tsf9C1pS – Robbie 2013-02-28 15:22:36

回答

23

提供的日志文件显示机器上已有几个文件的较新版本:

MSI (s) (0C:5C) [16:13:25:890]: Disallowing installation of component: {015A4DC1-56F4-562B-96B5-B3BE0D45FA5F} since the same component with higher versioned keyfile exists 
MSI (s) (0C:5C) [16:13:25:890]: Disallowing installation of component: {4B6A1404-3892-5BEF-AB47-8FE3149211A4} since the same component with higher versioned keyfile exists 

我以前在此更新程序中看到过这个问题。克里斯托弗是正确的。更新程序更新了它的文件,但没有告诉MSI(它不更新MSI,这不是正确的事情)。新的MSI认为新机器在机器上,选择不安装它的文件,但在升级过程中,旧包会删除这些文件(它不会注意到版本较新)。由于新的安装程序选择不安装这些文件,直到修复完成为止。

要解决此问题,您需要稍后移动您的RemoveExistingProducts操作。如果您使用的是MajorUpgrade元素,那么Schedule='afterInstallExecute'Schedule='afterInstallFinalize'应该做到这一点。你需要更加小心Component Rules

此外,恕我直言,第三方供应商不应该更新微星以外的文件。他们的决定是迫使你的产品进入一种特殊的升级方式。

+0

嗨罗布,感谢这个令人印象深刻的分析。您的解决方案有效而且,你已经指出了问题根源的正确方向。在构建机器上,AutomaticUpdater.dll事实上自动更新为高于我在其上创建新构建/安装的开发计算机上的版本。结果与您所描述的完全相同。您的解决方案可以工作,在将开发机器升级到第三方工具的相同版本后,我也可以解决这个问题。这有点让我在将来非常小心。 – Robbie 2013-02-28 17:10:45

+0

我曾在美国大陆航空公司看到过这种类型的问题,我们在生产中使用了诸如SMS/Wise等工具最初部署了应用程序,应用程序团队正在官方交付工具之外进行自己的自动更新。我必须做一个“强制卸载”来清理MSI的底线,然后击败应用程序团队的头部进行自动更新反模式,最终关闭MSI循环。 – 2013-02-28 19:10:51

+0

冠军!感谢罗布,毫无疑问地为我节省了几小时(几天?)的心痛。 – 2014-05-01 22:22:08

5

的日志文件会有所帮助。我的猜测是,它是基于您已计划在那里RemoveExistingProducts。我已经看到成本核算指出正在安装的文件与已安装的文件相同并决定不安装该文件的情况,然后进行主要升级并最终没有该文件。文件不存在并且成本计算意识到它需要安装

+0

安装日志文件在这里:http://pastebin.com/tsf9C1pS(希望这有助于) – Robbie 2013-02-28 15:23:27

+0

是的,它会有所帮助。但我的猜测通常都是现货。 :) – 2013-02-28 19:09:16

0

在旧版本的Windows Installer的问题记录在这里:

https://support.microsoft.com/en-us/kb/905238

,它的4.0和更高版本修复MSI引擎的受影响产品inplies列表。使用4。如果适用于操作系统版本,安装之前的5个可再发行软件应该有所帮助。

0

安装程序5.0仍然存在错误,并且仍然存在问题。 在InstallFinalize后面的地方RemoveExistingProduct的解决方法对我们来说无效。我强制通过单个文件的属性设置进行更新。

该解决方案现在适用于我们。