2016-12-30 28 views
-1

我正在嘗試爲當前使用MSI程序包進行部署的程序構建MSP修補程序。基於WiX documentation的示例,我已經能夠使用以下(稍微修改過的)WiX代碼成功生成PCP文件。試圖從MSI中刪除壓縮導致其文件消失

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <PatchCreation 
     Id="D25F1136-2BEE-4A82-9236-7261067D4BDC" 
     CleanWorkingFolder="yes" 
     OutputPath="XYZ.pcp" 
     WholeFilesOnly="yes" 
    > 
     <PatchInformation /> 
     <PatchMetadata 
      AllowRemoval="no" 
      Classification="Major Upgrade" 
      Description="XYZ Update" 
      DisplayName="XYZ Update" 
      ManufacturerName="XYZ" 
      MoreInfoURL="http://www.contoso.com/qr/XYZ.html" 
      TargetProductName="$(var.ProductName)" 
     /> 
     <Family Name="PrsnPtch"> 
      <UpgradeImage Id="LatestImage" SourceFile="new_msi_dir\XYZ.msi"> 
       <TargetImage Id="OldImage" Order="1" SourceFile="old_msi_dir\XYZ.msi" /> 
      </UpgradeImage> 
     </Family> 
     <PatchSequence PatchFamily="XyzPatch" Supersede="yes" /> 
    </PatchCreation> 
</Wix> 

和建立腳本設置爲撥打msimsp.exe

msimsp -s "%PCPDIR%\XYZ.pcp" -p "%PCPDIR%\XYZ.msp" -l "%PCPDIR%\patch.log" 

不幸的是,上面的命令失敗,出現以下錯誤信息:

ERROR: UpgradedImages.MsiPath '[...]\XYZ.msi' is marked as having compressed files (PID_WORDCOUNT property of Summary Information stream). PatchWiz is unable to patch files compressed in a cabinet.

所以,我試圖通過添加CompressionLevel屬性的MediaTemplate element WXS文件建立MSI的非壓縮版本。

<MediaTemplate EmbedCab="yes" CompressionLevel="none" /> 

對於構建MSI本身而言,這是成功的。生成的文件是未壓縮原始文件大小的3.7倍,並且7-Zip將其中的文件顯示爲具有「無」的壓縮方法。我能夠在VM上成功安裝該程序。

問題是,然後我仍然運行msimsp時得到「PatchWiz無法修補文件中壓縮的文件」錯誤。

的罪魁禍首似乎是在WXS Package element壓縮屬性:

<Package InstallerVersion="200" 
     Compressed="yes" 
     InstallScope="perMachine" 
     Description="XYZ Installer"/> 

所以很自然,我試圖改變Compressed="yes"Compressed="no"(與沒有其他更改此WXS文件)。而且這個「工作」,只要允許msimsp不給任何錯誤。

但它引入了MSI文件爲「空」的嚴重問題,其大小從大約3.6 MB減少到僅僅280 KB。在7-Zip中查看存檔顯示它不包含任何它應該安裝的文件。在Orca中查看它會顯示一行Media table,其中一行包含值DiskId = 1和LastSequence = 19,但Cabinet列中沒有任何內容(原始MSI在此處具有自動生成的「#cab1.cab」)。

爲什麼要更改壓縮屬性使CAB文件丟失?我如何解決它?

回答

4

使用帶有嵌入式駕駛室或外部駕駛室的MSI文件,此修補程序創建過程不起作用。它使用您使用msiexec/a創建的管理映像.....這將創建一個MSI文件以及其相應目錄中的所有外部鬆散文件。補丁創建過程使用這些管理映像中的兩個來生成補丁,即msp文件,並且它會比較每個映像中的每個對應文件,以創建兩個產品之間的差異。

管理安裝不是「安裝」 - 它主要是將文件從MSI中提取到目錄中的鬆散文件中。這也標誌着生成的MSI文件中包含「無文件」 - 它只是表格 - 所以如果補丁創建過程會發現這個或任何指示文件在駕駛室中的文件,就會抱怨。它需要單獨的鬆散文件。

一旦您有兩個管理映像,補丁創建過程(使用PCP文件)針對兩個映像運行,比較每個文件的更改並生成一個實際的補丁(一個msp文件)。 (請注意,PCP TargetImages表中存在一個IgnoreMissingSrcFiles設置,允許在創建修補程序時忽略丟失的文件 - 如果修補程序創建過程使用CAB文件,則此設置無效,因爲所有文件將始終在那裏)

+0

我不確定你可能有什麼假設你沒有談論,但使用管理員映像創建補丁與任何產品的安裝無關。 – PhilDW

+0

這很有道理,謝謝。 (評論刪除。) –

相關問題