我是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:&#39; CopyComponent&#39;是目录:&#39; INSTALLFOLDER&#39;。目录/组件对必须列在CreateFolders表中。
先谢谢
Abdulsalam
答案 0 :(得分:23)
此解决方案适用于WIX 3.11。
要获取整个目录,可以使用WIX工具集中的Heat。使用Heat,我们可以自动包含每个构建中给定源目录中的所有文件。为此,我们首先需要编辑Setup.wixproj
:
定义Heat的Harvestpath:
<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 Id="ProductFeature" Title="DiBA Tool" Level="1">
<...>
<ComponentGroupRef Id="HeatGenerated" />
</Feature>
答案 1 :(得分:3)
我在安装过程中做了类似于你需要的东西。我需要复制包含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>
这将在$(Configuration)\ bin \ dir上运行加热,并生成一个包含bin目录中所有文件的wxs文件。
这样,如果您在bin目录中添加或删除任何二进制文件,它将在您重建安装程序时自动获取(如果Bin.wxs文件不存在)。
现在你需要确保为wix定义变量“BinDir”,它指向构建机器上的bin目录。您还需要将Bin.wxs文件作为链接添加到wixproj中(当添加现有文件时,在“添加”上有一个小箭头下拉。单击并选择“添加为链接”。)
我认为在wix的某个地方有一个实际的热量目标,但我还没有看清楚它是如何使用它的。
答案 2 :(得分:1)
如果你不介意我这么说,我认为你已经陷入了混乱。
CopyFile将复制文件,将文件从目标计算机(安装安装的计算机,而不是开发计算机)上的一个位置复制到同一台计算机上的另一个文件夹。我不认为这是你想要的。
正如Brian建议您可以使用Heat扫描文件夹并为您生成一些代码。您可以通过以下两种方式之一使用它:
使用以下命令运行该工具:
heat dir ".\My Files" -gg -sfrag -template:fragment -out directory.wxs
然后,获取directory.wxs并将其用作源代码。
您可以在构建管道中使用Heat工具,以便编译安装将生成代码。
与Brian的建议相反,如果您使用的是MSBuild,我会建议the HarvestDirectory target。这就是我在做类似事情的地方:
<HarvestDirectory Include="$(MyHarvestDirectory)">
<InProject>false</InProject>
<PreprocessorVariable>var.MyHarvestDirectory</PreprocessorVariable>
<ComponentGroupName>MyComponentGroup</ComponentGroupName>
<DirectoryRefID>MY_DIRECTORY_ID</DirectoryRefID>
</HarvestDirectory>
这会将一个项目输入HarvestDirectory目标,并确保它们以正确的方式处理。此代码只是进入.wixproj中的ItemGroup。 (如果您不确定如何调整项目文件,请查看this video)
当然,这假设您正在使用MSBuild(或Visual Studio,因为它使用MSBuild)。
说完这一切之后,如果主要问题只是存在大量文件,我只会简单地说是指责并只定义列表。如果您愿意,可以使用Heat工具作为支架,但是只有学习语言并使用它才能替代它。尝试使用自动生成的代码执行操作可能会引入微妙的问题,并且使用静态列表总是更简单。
答案 3 :(得分:0)
作为其他答案的替代方法:
有一个名为Wax(GitHub,Visual Studio Marketplace)的Visual Studio扩展:
它提供了另一种使用GUI处理所有必需文件的方法。
它可能不像heat
这样的命令行工具那么复杂,但是它要简单得多,并且一开始就可以成为一个不错的友好工具,当您刚开始学习WiX并希望快速入门时。