【发布时间】:2017-05-15 00:00:33
【问题描述】:
我正在尝试为当前使用 MSI 包部署的程序构建 MSP 补丁。根据WiX documentation 中的示例,我已经能够使用以下(略微编辑的)WiX 代码成功生成 PCP 文件。
<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"
很遗憾,上述命令失败并显示以下错误消息:
错误:UpgradedImages.MsiPath '[...]\XYZ.msi' 被标记为具有 压缩文件(摘要信息的 PID_WORDCOUNT 属性 溪流)。 PatchWiz 无法修补压缩在压缩包中的文件。
所以我尝试通过向 its WXS 文件中的MediaTemplate element 添加一个 CompressionLevel 属性来构建一个未压缩版本的 MSI。
<MediaTemplate EmbedCab="yes" CompressionLevel="none" />
对于构建 MSI 本身来说,这是成功的。生成的文件是未压缩原始文件大小的 3.7 倍,并且 7-Zip 将其中的文件显示为具有“无”的压缩方法。而且我能够在虚拟机上成功安装程序。
问题是,然后我在运行 msimsp 时仍然收到“PatchWiz 无法修补压缩在一个文件柜中的文件”错误。
罪魁祸首似乎是 WXS Package element 上的 Compressed 属性:
<Package InstallerVersion="200"
Compressed="yes"
InstallScope="perMachine"
Description="XYZ Installer"/>
很自然地,我尝试将Compressed="yes" 更改为Compressed="no"(no 对此 WXS 文件进行了其他更改)。就允许 msimsp 不给出任何错误而言,这“有效”。
但是它引入了一个严重的问题,MSI 文件是“空的”,它的大小已经从大约 3.6 MB 减少到只有 280 KB。在 7-Zip 中查看存档表明它不包含任何应该安装的文件。在 Orca 中查看它会显示一个 Media table,其中一行包含值 DiskId=1 和 LastSequence=19,但在 Cabinet 列中没有任何内容(原始 MSI 在这里有一个自动生成的“#cab1.cab”)。
为什么更改压缩属性会使 CAB 文件丢失?我该如何解决?
【问题讨论】:
标签: wix windows-installer