我試圖提供一個簡單的安裝程序包(MSI),我想支持更新(修補程序),替代所有以前的修補程序。所以我有一個MSI V1.0.0和2個補丁V1.0.1和V1.0.2。用戶應該能夠安裝最新的補丁程序,而不管先前哪些補丁程序已經應用於系統。我的項目包含2個功能(客戶端和服務器)。修補程序的基礎始終是RTM包(HelloWorld 1.0.msi/HelloWorld 1.0.wixpdb)。WiX:修補程序安裝程序替代以前的版本(1.0.0 - > 1.0.1,1.0.0 - > 1.0.2,1.0.1 - > 1.0.2,aso。)
所有修補程序的生成(構建)工作,所以更新程序1.0.0 - > 1.0.1和1.0.0 - > 1.0.2做,但是當我嘗試從1.0.1更新到1.0。 2修補程序失敗並顯示以下錯誤消息:「升級修補程序無法由Windows Installer服務安裝,因爲要升級的程序可能會丟失,或者升級修補程序可能會更新程序的其他版本。在您的計算機上存在升級,並且您擁有正確的升級補丁。「更糟糕的是,當我在已安裝1.0.2的系統上運行1.0.1修補程序時,修補程序會用舊版本覆蓋現有安裝!我完全困惑...
我還在網上發現了一些關於修補的博客條目,但沒有與我的supersede szenario一起使用的博客條目。
威克斯補丁代碼 - 「patch1.wxs」:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Patch
AllowRemoval="yes"
Manufacturer="My Company"
MoreInfoURL="http://www.mycompany.com/"
DisplayName="HelloWorld V1.0 Patch 1"
Description="Patch intaller updating HelloWorld V1.0.x to V1.0.1"
Classification="Update">
<Media Id="32000" Cabinet="HelloWorldRTM.cab">
<PatchBaseline Id="HelloWorldRTM">
<Validate ProductId="yes" UpgradeCode="yes" ProductVersionOperator="LesserOrEqual" />
</PatchBaseline>
</Media>
<PatchFamilyRef Id="HelloWorldPatchFamily"/>
</Patch>
<Fragment>
<PatchFamily Id='HelloWorldPatchFamily' Version='1.0.1.0' Supersede='yes'>
<PropertyRef Id="ProductVersion"/>
<ComponentRef Id="HelloWorldServer.dll"/>
</PatchFamily>
</Fragment>
</Wix>
貼片1箇中構建腳本 - 「generate_patch1.bat」:
"%WIX%\bin\torch.exe" -p -xi ".\_Distrb\HelloWorld 1.0.wixpdb" ".\_Distrb\HelloWorld 1.0.1.wixpdb" -out ".\_Build\patch1.wixmst"
"%WIX%\bin\candle.exe" -out ".\_Build\patch1.wixobj" ".\patch1.wxs"
"%WIX%\bin\light.exe" ".\_Build\patch1.wixobj" -out ".\_Build\patch1.wixmsp"
"%WIX%\bin\pyro.exe" ".\_Build\patch1.wixmsp" -out ".\_Distrb\HelloWorld 1.0 Patch1.msp" -t HelloWorldRTM ".\_Build\patch1.wixmst"
威克斯修補代碼 - 「patch2.wxs」:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Patch
AllowRemoval="yes"
Manufacturer="My Company"
MoreInfoURL="http://www.mycompany.com/"
DisplayName="HelloWorld V1.0 Patch 2"
Description="Patch intaller updating HelloWorld V1.0.x to V1.0.2"
Classification="Update">
<Media Id="32000" Cabinet="HelloWorldRTM.cab">
<PatchBaseline Id="HelloWorldRTM">
<Validate ProductId="yes" UpgradeCode="yes" ProductVersionOperator="LesserOrEqual" />
</PatchBaseline>
</Media>
<PatchFamilyRef Id="HelloWorldPatchFamily"/>
</Patch>
<Fragment>
<PatchFamily Id='HelloWorldPatchFamily' Version='1.0.2.0' Supersede='yes'>
<PropertyRef Id="ProductVersion"/>
<ComponentRef Id="HelloWorldServer.dll"/>
<ComponentRef Id="HelloWorld.exe"/>
</PatchFamily>
</Fragment>
</Wix>
補丁2構建腳本 - 「generate_patch2.bat」:
"%WIX%\bin\torch.exe" -p -xi ".\_Distrb\HelloWorld 1.0.wixpdb" ".\_Distrb\HelloWorld 1.0.2.wixpdb" -out ".\_Build\patch2.wixmst"
"%WIX%\bin\candle.exe" -out ".\_Build\patch2.wixobj" ".\patch2.wxs"
"%WIX%\bin\light.exe" ".\_Build\patch2.wixobj" -out ".\_Build\patch2.wixmsp"
"%WIX%\bin\pyro.exe" ".\_Build\patch2.wixmsp" -out ".\_Distrb\HelloWorld 1.0 Patch 2.msp" -t HelloWorldRTM ".\_Build\patch2.wixmst"
修補程序創建有兩種方法:「使用修補程序創建屬性」或「使用純粹的WiX」。在「使用Purely WiX」出現問題之後 - 我使用這種方式,現在使用「使用補丁創建屬性」,沒有任何問題。鏈接:http://wix.sourceforge.net/manual-wix3/patching.htm – 2012-03-20 18:24:37
你是如何解決這個問題的? – boli 2014-09-30 12:16:54
@boli:不幸的不是。我們駁回它,現在卸載重新安裝,即使沒有那麼優雅的作品也是如此。 :(+ – moik 2014-11-12 15:27:47