簡體   English   中英

Wix - Superseding補丁沒有做任何事情

[英]Wix - Superseding patch doesn't do anything

我已經看到很多這樣的問題了,但是我找不到任何問題,但是我已經找到了一些問題。 我正在使用純粹的wix來構建小型升級。

這個問題是一個很像我的場景的例子,除了最后一部分。

  • 我有一個產品,我為其構建了一個RTM msi文件,我們稱之為Product-1.0.msi
    • 包含A.dll
  • 然后我構建一個名為Product-1.0.1.msp的補丁,它使用Product-1.0作為基線
    • 添加B.dll
  • 然后我構建一個名為Product-1.0.2.msp的補丁,它也使用Product-1.0作為基線
    • 添加B.dll + C.dll

這意味着我的補丁將始終包含前面的修補程序並相互取代。

場景:

  • 1.0 - > 1.0.1 工作正常
  • 1.0 - > 1.0.2 工作正常
  • 1.0 - > 1.0.1 - > 1.0.2 不起作用

在最后一個場景中,msp運行沒有抱怨但很快。 之后的原因是顯而易見的,因為實際上什么也沒做。 在ARP中,修補程序在“已安裝的更新”下以1.0.2版列出,但目標產品未更新,添加到修補程序(C.dll)的文件未添加到安裝文件夾中。 同樣適用於更新,第二個補丁不會修改文件。

卸載1.0.2時,將刪除修補程序(C.dll)中包含的文件, 包括已安裝1.0.1(B.dll)的文件。

ProductCode不變。
UpgradeCode保持不變。

這是Patch.wxs的內容:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Patch  MinorUpdateTargetRTM="yes"
            AllowRemoval="yes"
            Manufacturer="{Manufacturer}"
            DisplayName="{ProductName} {Version} Patch"
            Description="{ProductName} {Version} Patch"
            Classification="Update" 
            TargetProductName="{ProductName}" >
        <Media Id="5000" Cabinet="Patch.cab" EmbedCab="yes">
            <PatchBaseline Id="RTM">
                <Validate ProductVersionOperator="LesserOrEqual" ProductId="yes" UpgradeCode="yes" ProductVersion="Update" />
            </PatchBaseline>
        </Media>
        <PatchFamilyRef Id="PatchFamily"/>
    </Patch>

    <Fragment>
        <PatchFamily Id='PatchFamily' Version='{Version}' Supersede='yes'>
        </PatchFamily>
    </Fragment>
</Wix>

在此片段中,{Version}在第一個補丁中為1.0.1,在第二個補丁中為1.0.2。 否則,它們是相同的。

有什么想法嗎?

我終於讓它運轉了,這就是我找到的。 首先, 啟用MSI日志記錄
我發現兩個問題都導致了相同的行為。

我發現的第一個線索是來自MSI日志的這兩個片段:

1.0.1安裝:

MSI (s) (A4:60) [09:42:30:917]: SELMGR: New components have been added to feature 'ProductFeature'
MSI (s) (A4:60) [09:42:30:918]: SELMGR: Component 'comp_F8F80909F3D340B19A4CF3E6E172F386' is a new component added to feature 'ProductFeature'
....
MSI (s) (A4:60) [09:42:33:077]: Executing op: ComponentRegister(ComponentId={B49318A5-8DDE-449F-9B77-B67A3F7F8952},KeyPath=C:\[...]\B.dll,State=3,,Disk=1,SharedDllRefCount=0,BinaryType=0)

這是補丁中添加的新文件(B.dll)。

1.0.2安裝:

MSI (s) (A4:70) [09:47:02:508]: SELMGR: ComponentId '{B49318A5-8DDE-449F-9B77-B67A3F7F8952}' is registered to feature 'ProductFeature', but is not present in the Component table.  Removal of components from a feature is not supported!
MSI (s) (A4:70) [09:47:02:508]: SELMGR: Removal of a component from a feature is not supported

我擔心的原因很簡單,有點尷尬。 B.dll已被標記為新組件Id。 出於某種原因,安裝程序(直接運行msi / msp)沒有說出任何關於錯誤的內容,只是放棄了但是讓應用程序注冊了,就好像它處於升級狀態(ARP中為1.0.2)。

所以我在這里給你的提示是:對你生成的片段進行差異,並確保來自基線的任何新文件在兩個補丁.wxs文件中都顯示相同的組件和文件ID 即使你已經認為你知道他們這樣做了。

第二個問題是我想使用WixNetfxExtension捆綁.Net:

問題是我在斷開連接的系統上嘗試安裝並將redist安裝程序放在bundle中,而不是放在bundle exectuable的'redist'子文件夾中。 同樣,即使已安裝.Net,安裝程序也放棄並將應用程序保留在其(錯誤)升級狀態。 這真的不應該發生,特別是因為.Net是一個先決條件,所以我可能已經為捆綁做了其他事情,阻止它以錯誤的方式行事。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM