2012-03-06 52 views
4

我試圖提供一個簡單的安裝程序包(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" 
+0

修補程序創建有兩種方法:「使用修補程序創建屬性」或「使用純粹的WiX」。在「使用Purely WiX」出現問題之後 - 我使用這種方式,現在使用「使用補丁創建屬性」,沒有任何問題。鏈接:http://wix.sourceforge.net/manual-wix3/patching.htm – 2012-03-20 18:24:37

+0

你是如何解決這個問題的? – boli 2014-09-30 12:16:54

+0

@boli:不幸的不是。我們駁回它,現在卸載重新安裝,即使沒有那麼優雅的作品也是如此。 :(+ – moik 2014-11-12 15:27:47

回答

1

我有一個類似的問題,並通過給補丁wxs添加適當的驗證來修復它。試試這個...

<Media Id="32000" Cabinet="HelloWorldRTM.cab"> 
    <PatchBaseline Id="HelloWorldRTM"> 
    <Validate ProductId="yes" UpgradeCode="yes" ProductVersion="Major" ProductVersionOperator="GreaterOrEqual" /> 
    </PatchBaseline> 
</Media> 

如果你不想補丁時安裝的版本號比補丁的版本號更大的工作,你可能要改變的ProductVersion爲「Update」,並設置的ProductVersion到「GreaterOrEqual」。

我希望它適合你!

相關問題