WiX:如何防止将绑定文件的多个副本添加到MSI?

时间:2011-01-18 06:51:39

标签: wix windows-installer wix3

我有一个安装程序,它链接了一个wixlib。 wixlib将可执行文件安装到多个目录。

当我打开wixlib的“将文件绑定到库文件”(使用-bf开关)时,lit.exe将可执行文件添加到wixlib。但是,当我在MSI中链接wixlib时,可执行文件会多次添加到MSI文件中,从而使安装程序大小膨胀。

当我关闭“将文件绑定到库文件”时,问题不会发生(但显然,我需要设置WiX安装程序项目以了解在哪里找到可执行文件,而不是在wixlib中查找)。

使用和不使用-bf开关时,最终的MSI文件在使用orca查看时看起来相似,所以我很难理解为什么第一种情况下的MSI需要包含多个副本。

wixlib wxs文件如下所示:

<Fragment>

<ComponentGroup Id="cmpFoo1">
  <ComponentRef Id="cmpFooExe1" />
</ComponentGroup>

<DirectoryRef Id="TARGET_PATH1">
  <Component Id="cmpFooExe1" Guid="*">
    <File Id="filFooExe1" Name="foo.exe" KeyPath="yes" Source="$(var.source_path)\foo.exe" />
  </Component>
</DirectoryRef>

<ComponentGroup Id="cmpFoo2">
  <ComponentRef Id="cmpFooExe2" />
</ComponentGroup>

<DirectoryRef Id="TARGET_PATH2">
  <Component Id="cmpFooExe2" Guid="*">
    <File Id="filFooExe2" Name="foo.exe" KeyPath="yes" Source="$(var.source_path)\foo.exe" />
  </Component>
</DirectoryRef>

<Feature Id="ftFooFeatures" Level="1">
 <ComponentGroupRef Id="cmpFoo1"/>
 <ComponentGroupRef Id="cmpFoo2"/>
</Feature>

</Fragment>

安装程序wxs文件如:

<Product Id="MyProduct" Name="ProductName" Language="1033" Version="1.0.0.0" Manufacturer="MyCompany" UpgradeCode="{UpgradeCode_Guid}">
<!-- ...etc... -->

<Directory Id="ROOT_TARGET_PATH" Name="Foo">
  <Directory Id="TARGET_PATH1" Name="Foo1" ComponentGuidGenerationSeed="{Guid1}" />
  <Directory Id="TARGET_PATH2" Name="Foo2" ComponentGuidGenerationSeed="{Guid2}" />
</Directory>

<Feature Id="ftMain" Level="1">
  <FeatureRef Id="ftFooFeatures" />
</Feature>

<!-- ...etc... -->
</Product>

期望最终安装列表如下: C:\ FOO \ foo1 \ foo.exe的 C:'富\ foo2的\ foo.exe的

有没有办法阻止WiX(可能是链接器?)将foo.exe的多个副本添加到最终的MSI文件中,同时仍然将foo.exe与wixlib绑定?

2 个答案:

答案 0 :(得分:4)

WiX有一项名为Smart Cabbing的功能。如果文件元素具有完全相同的源路径属性,WiX应该自动为您执行此操作。

之前已经在StackOverflow上询问了这个问题,但现在还是太早才找到它。 :-)你可能想搜索并找到它,因为我记得问题是“我有相同的源路径,为什么不工作”Rob Mensching跳进线程但我不记得了决议是什么。

答案 1 :(得分:0)

我能想到的最好的办法是避免将.exe的多个副本放入安装程序中,而是使用CopyFile元素。

如果您考虑不仅要复制您安装的文件,还要复制目标PC上存在的其他文件,请记住包含RemoveFile元素,因为such files are not removed by Windows Installer on uninstall