首先,我使用的是 WiX 版本 3.5.2519.0,但我也在最新的 3.6 版本上对此进行了测试,结果相同。
我很难找出 PatchFamily 如何准确地过滤掉 Torch 生成的差异的某些部分。按照手册中的示例(“使用纯 WiX 构建补丁” http://wix.sourceforge.net/manual-wix3/wix_patching.htm),我已经能够成功生成一个基本的安装程序 + 补丁作为广告。但是,当我尝试扩展该示例时,我遇到了一些问题。
短版:我在 Product.wxs 中将新组件 B 添加到与原始组件 A 相同的文件夹中,然后构建安装程序的 1.0 版和 1.1 版。组件 A 和 B 的文件在 1.0 和 1.1 版本之间进行了更改。
使用火炬,我生成安装程序 1.0 和 1.1 之间的转换。
使用 pyro,我创建了 msp 补丁。请注意,我没有更改 Patch.wxs,因此 PatchFamily 元素仍然只包含组件 A 的 ComponentRef,而不包含组件 B。
现在,基于此,我假设当我应用补丁时会发生什么是组件 A 的文件将被更新,但组件 B 的文件将保持不变。换句话说,该 pyro 将从 torch 中获取总变换,其中包含组件 A 和 B 的变换,但随后过滤掉所有在 PatchFamily 元素中找不到的变换动作,因此剩下的所有内容都在最终补丁是组件 A 的变换。
显然我错了,所以我真正想知道的是,如果可能的话,我如何在创建补丁时从差异中过滤掉不需要的转换?
详细版本,如果您想要文件的内容和使用的命令:
产品.wxs:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="48C49ACE-90CF-4161-9C6E-9162115A54DD"
Name="WiX Patch Example Product"
Language="1033"
Version="1.0.0"
Manufacturer="Dynamo Corporation"
UpgradeCode="48C49ACE-90CF-4161-9C6E-9162115A54DD">
<Package Description="Installs a file that will be patched."
Comments="This Product does not install any executables"
InstallerVersion="200"
Compressed="yes" />
<Media Id="1" Cabinet="product.cab" EmbedCab="yes" />
<FeatureRef Id="SampleProductFeature"/>
</Product>
<Fragment>
<Feature Id="SampleProductFeature" Title="Sample Product Feature" Level="1">
<ComponentRef Id="SampleComponent" />
<ComponentRef Id="SampleComponent2" />
</Feature>
</Fragment>
<Fragment>
<DirectoryRef Id="SampleProductFolder">
<Component Id="SampleComponent" Guid="{C28843DA-EF08-41CC-BA75-D2B99D8A1983}" DiskId="1">
<File Id="SampleFile" Name="Sample.txt" Source=".\$(var.Version)\Sample.txt" />
</Component>
<Component Id="SampleComponent2" Guid="{C28843DA-EF08-41CC-BA75-D2B99D8A1984}" DiskId="1">
<File Id="SampleFile2" Name="Sample2.txt" Source=".\$(var.Version)\Sample2.txt" />
</Component>
</DirectoryRef>
</Fragment>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder" Name="PFiles">
<Directory Id="SampleProductFolder" Name="Patch Sample Directory">
</Directory>
</Directory>
</Directory>
</Fragment>
</Wix>
补丁.wxs:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Patch
AllowRemoval="yes"
Manufacturer="Dynamo Corp"
MoreInfoURL="http://www.dynamocorp.com/"
DisplayName="Sample Patch"
Description="Small Update Patch"
Classification="Update"
>
<Media Id="5000" Cabinet="RTM.cab">
<PatchBaseline Id="RTM"/>
</Media>
<PatchFamilyRef Id="SamplePatchFamily"/>
</Patch>
<Fragment>
<PatchFamily Id='SamplePatchFamily' Version='1.0.0.0' Supersede='yes'>
<ComponentRef Id="SampleComponent"/>
</PatchFamily>
</Fragment>
</Wix>
两个子文件夹 1.0 和 1.1,都包含具有不同(不同)内容的 Sample.txt 和 Sample2.txt。
命令:
candle.exe -dVersion=1.0 product.wxs
light.exe product.wixobj -out 1.0\product.msi
candle.exe -dVersion=1.1 product.wxs
light.exe product.wixobj -out 1.1\product.msi
torch.exe -p -xi 1.0\product.wixpdb 1.1\product.wixpdb -out patch\diff.wixmst
candle.exe patch.wxs
light.exe patch.wixobj -out patch\patch.wixmsp
pyro.exe patch\patch.wixmsp -out patch\patch.msp -t RTM patch\diff.wixmst
编辑:正如 Bob Arnson 很好地指出的那样,片段元素“成为一个不可变的原子单元,可以完全包含或排除在产品中”,因此为了单独更新文件,它们必须在不同的片段中定义. 这当然很高兴知道,因为到目前为止我只将片段视为分离元素引用和元素定义的一种方式。如果有人对远程感兴趣,以下将是 Product.wxs 的工作版本:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="48C49ACE-90CF-4161-9C6E-9162115A54DD"
Name="WiX Patch Example Product"
Language="1033"
Version="1.0.0"
Manufacturer="Dynamo Corporation"
UpgradeCode="48C49ACE-90CF-4161-9C6E-9162115A54DD">
<Package Description="Installs a file that will be patched."
Comments="This Product does not install any executables"
InstallerVersion="200"
Compressed="yes" />
<Media Id="1" Cabinet="product.cab" EmbedCab="yes" />
<FeatureRef Id="SampleProductFeature"/>
</Product>
<Fragment>
<Feature Id="SampleProductFeature" Title="Sample Product Feature" Level="1">
<ComponentRef Id="SampleComponent" />
<ComponentRef Id="SampleComponent2" />
</Feature>
</Fragment>
<Fragment>
<DirectoryRef Id="SampleProductFolder">
<Component Id="SampleComponent" Guid="{C28843DA-EF08-41CC-BA75-D2B99D8A1983}" DiskId="1">
<File Id="SampleFile" Name="Sample.txt" Source=".\$(var.Version)\Sample.txt" />
</Component>
</DirectoryRef>
</Fragment>
<Fragment>
<DirectoryRef Id="SampleProductFolder">
<Component Id="SampleComponent2" Guid="{C28843DA-EF08-41CC-BA75-D2B99D8A1984}" DiskId="1">
<File Id="SampleFile2" Name="Sample2.txt" Source=".\$(var.Version)\Sample2.txt" />
</Component>
</DirectoryRef>
</Fragment>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder" Name="PFiles">
<Directory Id="SampleProductFolder" Name="Patch Sample Directory">
</Directory>
</Directory>
</Directory>
</Fragment>
</Wix>