[英]Wix - MSI Upgrade without removing older version
我想知道是否可以使用該產品的較新版本覆蓋舊文件。 有幾百個文件,所以有更好的方法嗎? 由於升級完全清除了所有文件。 我希望升級MSI覆蓋文件。
我的升級邏輯如下:
<Upgrade Id="$(var.UpgradeCode)">
<UpgradeVersion Minimum="$(var.ProductVersion)"
IncludeMinimum="no"
OnlyDetect="yes"
Property="NEWPRODUCTFOUND" />
<UpgradeVersion Minimum="$(var.RTMProductVersion)"
IncludeMinimum="yes"
Maximum="$(var.ProductVersion)"
IncludeMaximum="no"
Property="UPGRADEFOUND" />
</Upgrade>
<CustomAction Id="PreventDowngrading" Error="Newer version already installed" />
<InstallUISequence>
<Custom Action="PreventDowngrading" After="FindRelatedProducts">NEWPRODUCTFOUND</Custom>
</InstallUISequence>
<InstallExecuteSequence>
<Custom Action="PreventDowngrading" After="FindRelatedProducts">NEWPRODUCTFOUND</Custom>
<RemoveExistingProducts After="InstallFinalize" />
<InstallExecute After="RemoveExistingProducts" />
</InstallExecuteSequence>
我需要快速寫這篇文章,請耐心等待,但是這里有:
軟件包之間的組件GUID必須保持相同,以便文件正確更新,尤其是在通過修補程序進行部署時。 組件GUID不匹配的主要症狀是,在部署完成(以及永遠無法工作的補丁程序)之后,文件恰恰丟失了。
如PhilDW所述,設置適當的主要升級,並使組件GUID在各個發行版之間保持一致,並遵循組件創建規則,並且您的升級應正確工作(以及您的補丁程序)。
請注意,您可以將組件GUID保留在WiX源文件之外,並允許它們自動生成而不是硬編碼,並且您仍將獲得一致的GUID。 自動生成的GUID 會計算出一個穩定的GUID (請閱讀鏈接的問題,接受的答案及其所有注釋),在各個發行版之間保持穩定,除非您重命名或移動有問題的文件-這需要新的組件GUID, 在這里這就是原因 (這也解釋了為什么可以自動生成穩定的GUID)。 自動GUID生成將檢測何時需要新的GUID。
我不能通過heat.exe進行收獲,但是我認為它可以自動生成組件GUID,而不是硬編碼。 只需更改腳本或自動化過程即可將組件GUID設置為自動生成(在組件標簽中使用*代替GUID)。 請同時閱讀完整的答案以及所有答案和注釋: WIX中GUID的語法?
重要! 補丁程序只是用於MSI升級的一種交付方法,已經作為完整的軟件包工作。 在您確認完整,更新的MSI軟件包正確升級了以前的版本之前,不要浪費任何時間來生成補丁。 如果這樣做,您只會浪費時間-如果完整的更新不起作用,該補丁將永遠無法工作。 不行
產品的第一個版本是否已發布? 如果不是,我建議從頭開始並使用自動生成的GUID。 如果您的先前版本是實時版本,並且具有硬編碼的組件GUID,則需要將第一個版本中的現有組件GUID與更新版本中的組件GUID進行匹配,或者必須按照zett42的建議將RemoveExistingProducts放在InstallExecuteSequence中,以允許在安裝新版本之前,要完全卸載舊版本。 這將防止組件引用中的先前錯誤影響主要升級,並且升級后不應丟失任何文件。 由於組件引用不正確,因此在這種方法中根本無法進行修補 。 這使得次要和主要升級修補程序均失敗-都需要100%的組件引用才能正常工作。
這已經很長了。 如果這一切聽起來對您來說都是希臘文,請閱讀鏈接的stackoverflow答案,並全面了解MSI組件創建最佳實踐和組件引用。 對此也請參見MSDN。 我會再檢查一下,看看您的情況如何,一旦知道不清楚和您的位置,便可以稍微整理一下答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.