2017-10-13 243 views
0

我使用的是WiX 3.8(我認爲最新的穩定版本),並且我似乎無法獲得配置文件而不是在安裝期間卸載並重新安裝一個重大升級。WiX 3.8在主要升級期間保持配置文件狀態

有很多這方面的問題 - 很多答案指出this網站是一個很好的答案。然而,給出的建議不起作用(對我而言)。

該網站所說的是將每個配置文件放置在其自己的組件中,並將該文件標記爲組件的關鍵路徑。類似這樣的:

<Component Id="config.xml" 
      Guid="*" 
      Directory="folder_where_config_file_lives"> 
     <File Id="config_file" 
       Source="$(var.Project.ProjectDir)bin\Release\configFile.xml" 
       KeyPath="yes"/> 
    </Component> 

太好了。接下來,它說,InstallFiles行動,像這樣經過調度RemoveExistingProduct

<InstallExecuteSequence> 
    <RemoveExistingProducts After="InstallFiles"/> 
</InstallExecuteSequence> 

問題是,當我編譯,我得到這個錯誤:

The InstallExecuteSequence table contains an action 'RemoveExistingProducts' that is declared in two different locations. Please remove one of the actions or set the Overridable='yes' attribute on one of their elements.

This person也有這個問題,但他似乎已經解決了它。什麼固定則他將調度屬性的,從而有效地擺脫了「兩個不同的位置」申報的問題(我猜):

​​

所以,當我代替時間表改變屬性(其包含一個屬性本身,我猜),它不僅不起作用 - 配置文件在升級過程中被移除和替換 - 它會導致更多的怪異。我的項目有一個帶有許多MSI的引導程序,儘管我獲得了安裝包含配置文件的MSI之後的所有MSI的日誌文件,但未安裝它們。

讓我重複一遍:日誌說MSI已安裝,但它們不是。在日誌文件中可能找不到某個地方的回滾,但是讀取MSI日誌文件時,它看起來像安裝游泳一樣。

有沒有人知道配置文件到而不是在Wix 3.8的主要升級過程中被刪除和重新安裝?我上面提到的是來自互聯網的最好的信息,我可以找到,但我已經嘗試了幾乎所有的東西都無濟於事。

回答

2

MajorUpgrade元素具有您需要的一切,包括RemoveExistingProducts操作的安排位置。不要將RemoveExistingProducts添加到序列中。

RemoveExistingProducts不應該在InstallFiles之後。目前尚不清楚哪裏是從何而來,但文檔不說這是一個選擇:

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

當RemoveExistingProducts早早測序(如InstallInitialize或InstallValidate後),這意味着你得到有效卸載舊產品,然後安裝新產品升級,這意味着卸載配置文件並在升級中安裝該文件。保留配置文件的方法是調度REP afterInstallExecute。這會導致升級,這基本上是新產品的版本規則安裝,而不是舊版安裝。版本規則意味着如果你想更新的二進制文件,你必須更新他們的文件版本。有關數據文件(您的配置文件)的好消息是,更新的數據文件不會被取代:

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

老產品,那麼被卸載,保留所產生的文件集。

因此,在MajorUpgrade中REP afterInstallExecute的REP的順序似乎是你想要的。需要注意的是,您需要遵循組件規則,如果您在WiX中有自動生成的* guid,它應該會自動發生。

+0

哈利路亞!你的建議有效!你給的這些鏈接...... MSDN似乎認爲讀者理解了很多術語。是否有一個「Windows安裝程序適合那些被當作寶寶放在腦袋裏的人」教科書或者你可以推薦的東西?我有ORCA,所以我可以看看序列,但是我還沒有找到從頭開始學習這些東西的地方(尼克拉米雷斯的教科書,就像一個新手一樣好,沒有覆蓋到它的深度需要真正發展)。你從哪裏學到的? (Snarky答案高興地接受。) – Bob

+0

看看你是否仍然可以獲得Windows安裝程序的權威指南,舊的,但仍然相關,涵蓋基礎知識:)。 – PhilDW

+0

我會。謝謝。 – Bob

0

IMO,Windows Installer是在XML被捕獲之前發明的,組件規則不能很好地處理它。我更喜歡做的是不打這種行爲。編寫應用程序,以便一個配置文件由安裝程序擁有,並且始終可以安全地覆蓋,另一個配置文件保存用戶配置數據,而且MSI不知道。這第二個文件應該覆蓋第一個文件。

+0

謝謝你的建議。 PhilDW的答案似乎有效,但從長遠來看可能不會,最終可能會根據您的建議(我經常發現自己只是編寫自定義操作來解決WiX應該可以解決的問題,因爲我無法獲得canon WiX解決方案)。然而,你的建議給我留下了問題:MSI如何「不知道」文件?我想我要求你在你的帖子上稍微擴大一點。你能做到嗎? – Bob

+0

由應用程序或自定義操作創建的文件,而不是由MSI創建的文件。 –

+0

考慮一下這個。讓我們假設你的配置在構建之一中有一些關鍵值對。假設用戶將其中的某個值設置爲某個值。現在更新的版本添加了一個額外的鍵值對。升級過程中安裝者應該做些什麼?覆蓋並獲取新的KVP,但丟失用戶數據或不覆蓋並保存用戶數據,但無法獲得新的KVP?您可以編寫複雜的自定義操作來收穫變化量,替換文件並重新應用它們,或者您可以通過將數據存儲在兩個文件中來消除整個問題。合理? –