2008-12-10 100 views
5

我有一個包含配置參數和其他數據隨用戶使用應用程序而改變的多個文件的應用程序。這些文件可以隨着我的軟件的更新版本而改變,但是用戶也可以修改它們(或者它們可能被應用程序本身改變)。基本上,我正在尋找一種解決方案來防止用戶對這些文件所做的更改被覆蓋,同時也是在用戶升級我的軟件時安裝可能更新的文件的一種方法。使用WiX管理配置文件

對於* NIX上的RPM,您可以使用%config函數將文件定義爲配置文件,然後RPM會重命名現有文件(如果存在)並在升級時安裝新文件(可能不理想,但我可以爲這樣的WiX生活)。

我想將我的配置文件安裝到子目錄或甚至不同的名稱(例如default.cfg),然後使用WiX中的<CopyFile>元素將文件複製到正確的位置。這樣,默認文件將在安裝時被刪除並在升級時被覆蓋,但實際的用戶文件將保持不變。不幸的是,<CopyFile>,Windows安裝程序仍然想要管理(並刪除)目標文件。

我也考慮過在WixUtilExtension中使用QtExec動作,基本上是做「複製default.cfg reallocation.cfg」,但這不起作用,而且有點破解。

處理這個問題的正確方法是什麼?

回答

2

我認爲沒有「乾淨」的方式來做到這一點,因爲msi項目必須能夠通過設計完全卸載自己。我認爲解決這個問題的最好方法是使用執行批處理文件的自定義操作,並將配置文件更新邏輯放入該批處理文件中。自定義動作看起來像這樣(只相關部分):

<Directory Id="MYDIR" Name="MyDir"> 
    <Component Id="update.cmd" Guid="YOUR-GUID"> 
     <File Id="update.cmd" Name="update.cmd" KeyPath="yes" 
       Source="source\update.cmd" /> 
    </Component> 
</Directory> 

<CustomAction Id='RunUpdate' Directory='MYDIR' 
     ExeCommand='[SystemFolder]cmd.exe /c update.cmd' Return='ignore'/> 

<InstallExecuteSequence> 
    <Custom Action='RunUpdate' After='InstallFinalize'>NOT Installed</Custom> 
</InstallExecuteSequence> 
4

我的建議通常是在一個單獨的文件中的用戶可編輯的內容和管理通過應用程序,而不是安裝。這也意味着單獨的文件是「用戶內容」,應該不在安裝中。

我發現試圖以聲明方式執行用戶數據遷移,看起來很難。試圖在安裝時進行安裝,卸載,修復,修補和回滾所有這些情況只會使情況變得更糟。

例如,RPM行爲對「修復」做了什麼?複製用戶數據並將其替換爲一個好文件?這可能是正確的60% - 80%的時間。並卸載,該文件應該被刪除?如果用戶只是升級到下一個版本,這很棘手。

同樣,最好讓他們決定如何調整配置。恕我直言。