【问题标题】:Attempting to remove compression from an MSI causes its files to disappear尝试从 MSI 中删除压缩会导致其文件消失
【发布时间】: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


    【解决方案1】:

    此补丁创建过程不适用于使用带有嵌入式 cab 或外部 cab 的 MSI 文件。它使用您使用 msiexec /a 创建的管理映像..... 这将创建一个 MSI 文件以及相应目录中的所有外部松散文件。补丁创建过程使用这些管理映像中的两个来生成补丁,即 msp 文件,并比较每个映像中的每个对应文件以创建两个产品之间的增量。

    管理安装不是“安装” - 它主要只是将文件从 MSI 提取到目录中的松散文件中。这也将生成的 MSI 文件标记为其中没有“文件”——它只是表——所以如果补丁创建过程发现这个或任何表明文件在 cab 中的东西,它将抱怨。它需要单独的松散文件。

    一旦您有两个管理映像,补丁创建过程(使用 PCP 文件)将针对这两个映像运行,比较每个文件的更改并生成一个实际的补丁,一个 msp 文件。

    (请注意,PCP TargetImages 表中有一个 IgnoreMissingSrcFiles 设置允许在创建补丁时忽略丢失的文件 - 如果补丁创建过程使用 CAB 文件,则此设置没有意义,因为所有文件将永远存在。)

    【讨论】:

    • 我不确定你可能有什么假设,但你不是在谈论,但使用管理图像创建补丁与任何产品的安装方式无关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多