2017-04-25 81 views
0

我們有一個使用wix構建的MSI,它安裝了我們的基於ruby的產品。當我們發佈第一個版本時,有一個錯誤。升級會覆蓋對ruby配置文件(gemrc)的更改,在某些情況下會有效打破產品。WIX,如何不替換配置文件

我一直在試圖讓MSI無法刪除或替換升級時的配置文件,但沒有成功。

我現在擁有的是:

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


    <Directory Id="embeddedDir" Name="embedded"> 
    <Directory Id="embeddedEtcDir" Name="etc"> 
     <Component Id="gemrcComponent" Guid="uuid..." NeverOverwrite='yes' Permanent='yes'> 
     <File Id='gemrc' Name='gemrc' 
       Source='$(var.ProjectSourceDir)\embedded\etc\gemrc.default' Vital='yes' KeyPath='yes' /> 
     </Component> 
    </Directory> 

    </Directory> 

然而,從當前版本(1.0)到新版本(1.1)打算將離開安裝沒有gemrc可言。繼續前進它可以工作,所以從1.1到1.2會離開現有的(修改過的)文件。

我假設,它不起作用的原因是因爲它使用舊的1.0 MSI來刪除現有的安裝,並且該版本已將gemrc文件標記爲需要刪除的產品的一部分。

這意味着我可以解決這個問題的唯一方法是使用自定義操作(在安裝之前將文件複製到臨時路徑,然後再將其移回 或類似的東西)。有更好/更簡單的方法嗎?

+0

由於安裝程序和配置文件的問題,我們在項目中決定不安裝安裝程序的配置文件。麻煩是不值得的。我們的應用程序查找現有的配置文件,如果它們不存在,請創建一個默認文件。 在移除過程中,我們要求保留配置文件,如果不是,請刪除它們。 – linuxrocks

回答

2

你們有些人可能會看到這種情況的原因如下,但沒有足夠的信息,說這可能會在你的情況下適用:

如果你原來有一個重大的升級計劃「早」(InstallInitialize或更早),那麼升級將完全卸載舊產品,然後安裝新產品。這看起來像是覆蓋配置文件,但嚴格來說不是。如果您確定此問題的實際根本原因,或者主要升級計劃安排有所不同,您不會說。

在InstallExecuteAgain後計劃的主要升級中,升級將安裝在舊產品之上並遵循文件替換規則。所以如果配置文件在安裝後確實被更新了,它將不會被替換。

如果配置文件的組件ID在任何設置之間改變,那麼您會看到它被刪除(即使在InstallExecuteAgain升級中)。文件共享是通過組件ID來計算的,所以如果升級的配置文件的組件ID與之前的安裝不一樣,那麼你會看到奇怪的行爲,因爲前一個文件的引用計數意味着它將被刪除,但是你試圖用不同的id安裝另一個相同的名字。

您應該使用詳細的MSI日誌記錄啓用升級,以查看配置文件會發生什麼情況。如果不清楚的話,可以將它發佈到其他人可以查看的地方。

+0

組件ID確實發生了變化,因爲舊版本未將該文件指定爲單獨的組件。 另請注意,1.1 MSI中的gemrc文件將始終具有較新的上次更新的時間戳,因爲它是在MSI生成時生成的。 – user831865