我有一个安装程序,它链接了一个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绑定?
答案 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。