2013-02-28 132 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的解決方法對我們來說無效。我強制通過單個文件的屬性設置進行更新。

該解決方案現在適用於我們。