我是 Wix 的新手,我成功为我的项目创建了 MSI 安装程序,但我的 Bin 文件夹有很多带有 EXE 主文件的 DLL 文件,我想将所有这些文件包含在安装程序中
我找到了THIS解决方案,这似乎是正确的,但不幸的是我无法在我的Wix文件中完成这个解决方案,这是我的Wix文件:
<Product Id="*" Name="Setup"
Language="1033" Version="1.0.1.0"
Manufacturer="ORDER MS"
UpgradeCode="a4f0a0d0-ae64-4f62-9bb3-efa7e75072e0">
<Package InstallerVersion="200"
Compressed="yes"
InstallScope="perMachine" />
<MajorUpgrade Schedule="afterInstallInitialize"
DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<MediaTemplate />
<Feature Id="ProductFeature" Title="Setup" Level="1">
<ComponentGroupRef Id="ProductComponents" />
<ComponentRef Id="ApplicationShortcutDesktop" />
<ComponentRef Id="ApplicationShortcut" />
</Feature>
<Icon Id="Icon.exe" SourceFile="$(sys.CURRENTDIR)\icon.ico"/>
<Property Id="ARPPRODUCTICON" Value="icon.exe" />
<ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
<Component Id="ProductComponent">
<File Source="$(var.Order.TargetPath)" />
</Component>
<Component Guid="A7C42303-1D77-4C70-8D5C-0FD0F9158EB4" Id="CopyComponent">
<CopyFile Id="SomeId"
SourceProperty="SOURCEDIRECTORY"
DestinationDirectory="CopyTestDir" SourceName="*" />
</Component>
</ComponentGroup>
我收到此错误:
错误 1 ICE18:组件的 KeyPath:“CopyComponent”是目录:“INSTALLFOLDER”。目录/组件对必须列在 CreateFolders 表中。
此解决方案适用于 WIX 3.11。
要收获整个目录,您可以使用 WIX 工具集中的 Heat。使用 Heat,我们可以在每次构建时自动包含给定源目录中的所有文件。为此,我们首先需要编辑
Setup.wixproj
:
定义热量的收获路径:
<PropertyGroup>
<DefineConstants>HarvestPath=...\Deploy</DefineConstants>
</PropertyGroup>
Heat 将创建一个
.wxs
文件。所以我们需要将此文件添加到编译ItemGroup中:
<ItemGroup>
<Compile Include="Product.wxs" /> <!-- This will be your default one -->
<Compile Include="HeatGeneratedFileList.wxs" /> <!-- This is the Heat created one -->
</ItemGroup>
然后在
BeforeBuild
构建目标中执行Heat:
<Target Name="BeforeBuild">
<HeatDirectory Directory="..\Deploy"
PreprocessorVariable="var.HarvestPath"
OutputFile="HeatGeneratedFileList.wxs"
ComponentGroupName="HeatGenerated"
DirectoryRefId="INSTALLFOLDER"
AutogenerateGuids="true"
ToolPath="$(WixToolPath)"
SuppressFragments="true"
SuppressRegistry="true"
SuppressRootDirectory="true" />
</Target>
每次构建 WIX 安装程序时都会生成
HeatGeneratedFileList.wxs
。目录 ..\Deploy
必须设置为要包含的文件的目录。
要将这些文件包含在安装程序中,我们唯一要做的就是编辑主 .wxs
文件(如本示例中的 Product.wxs
)。 Heat 将创建一个具有上面给定名称的 ComponentGroup
。该组件需要在Product.wxs
的Feature部分引用:
<Feature Id="ProductFeature" Title="DiBA Tool" Level="1">
<...>
<ComponentGroupRef Id="HeatGenerated" />
</Feature>
如果你不介意我这样说的话,我认为你已经陷入了一些混乱。
CopyFile 将复制文件,将文件从目标计算机(正在安装安装的计算机,而不是开发计算机)上的一个位置复制到同一计算机上的另一个文件夹。我认为这不是你想要的。
正如 Brian 建议的那样,您可以使用 Heat 扫描文件夹并为您生成一些代码。您可以通过以下两种方式之一使用它:
使用此类命令运行该工具:
heat dir ".\My Files" -gg -sfrag -template:fragment -out directory.wxs
然后,获取directory.wxs并将其用作源代码。
您可以在构建管道中使用Heat工具,这样编译安装就会生成代码。
与 Brian 的建议相反,如果您使用 MSBuild,我建议使用 HarvestDirectory 目标。这是我正在做类似事情的地方:
<HarvestDirectory Include="$(MyHarvestDirectory)">
<InProject>false</InProject>
<PreprocessorVariable>var.MyHarvestDirectory</PreprocessorVariable>
<ComponentGroupName>MyComponentGroup</ComponentGroupName>
<DirectoryRefID>MY_DIRECTORY_ID</DirectoryRefID>
</HarvestDirectory>
这会将项目馈送到 HarvestDirectory 目标中,并确保以正确的方式处理所有项目。此代码只是进入 .wixproj 中的 ItemGroup。 (如果您不确定如何调整项目文件,请观看此视频)
当然,这假设您正在使用 MSBuild(或 Visual Studio,因为它使用 MSBuild)。
话虽如此,如果主要问题只是有很多文件,我只想说努力并定义列表。如果您愿意,可以使用 Heat 工具作为支架,但是学习语言并使用它是无可替代的。尝试使用自动生成的代码执行操作可能会引入微妙的问题,并且使用静态列表总是更简单。
我在安装过程中执行了与您此处要求类似的操作。我需要复制一个包含 1000 多个文件的文件夹的内容(帮助文件)。
我为解决此问题所做的操作如下:
在Installer.wixproj中我定义了以下内容:
<Target Name="BeforeBuild" >
<Exec Command=""$(WixToolPath)Heat.exe" dir "$(MSBuildThisFileDirectory)\$(Configuration)\bin" -ag -cg BinDir -dr BIN -template fragment -sreg -sfrag -srd -var var.BinDir -o "$(MSBuildThisFileDirectory)\Components\Bin.wxs"" Condition="!Exists('$(MSBuildThisFileDirectory)\Components\Bin.wxs')" />
</Target>
这将在\ dir中的$(Configuration)上运行heat并生成一个wxs文件,包括bin目录中的所有文件。
这样,如果您在 bin 目录中添加或删除任何二进制文件,当您重建安装程序时,它会自动被拾取(如果 Bin.wxs 文件不存在)。
现在您需要确保为 wix 定义变量“BinDir”,它指向构建机器上的 bin 目录。您还需要将 Bin.wxs 文件作为链接添加到您的 wixproj(添加现有文件时,“添加”上有一个小箭头下拉菜单。单击该箭头并选择“添加为链接”。)
我认为 Wix 中的某个地方有一个实际的热目标,但我还没有仔细研究过它,还不知道如何使用它。
更新:自 2024 年 3 月 16 日起,这不适用于 WiX 4:https://github.com/tom-englert/Wax/issues/82(谢谢,@hellobody)
有一个名为 Wax 的 Visual Studio 扩展(GitHub、Visual Studio Marketplace):
它提供了一种使用 GUI 处理所有所需文件的替代方法。
它可能不像
heat
这样的命令行工具那么复杂,但它更简单,并且当您刚开始学习 WiX 并想要快速入门时,它可以成为一个很好且友好的工具。