在 Wix 安装程序中包含 Bin 文件夹中的所有文件

问题描述 投票:0回答:4

我是 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
4个回答
76
投票

此解决方案适用于 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>

8
投票

如果你不介意我这样说的话,我认为你已经陷入了一些混乱。

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 工具作为支架,但是学习语言并使用它是无可替代的。尝试使用自动生成的代码执行操作可能会引入微妙的问题,并且使用静态列表总是更简单。


6
投票

我在安装过程中执行了与您此处要求类似的操作。我需要复制一个包含 1000 多个文件的文件夹的内容(帮助文件)。

我为解决此问题所做的操作如下:

在Installer.wixproj中我定义了以下内容:

<Target Name="BeforeBuild" >
    <Exec Command="&quot;$(WixToolPath)Heat.exe&quot; dir &quot;$(MSBuildThisFileDirectory)\$(Configuration)\bin&quot; -ag -cg BinDir -dr BIN -template fragment -sreg -sfrag -srd -var var.BinDir -o &quot;$(MSBuildThisFileDirectory)\Components\Bin.wxs&quot;" Condition="!Exists('$(MSBuildThisFileDirectory)\Components\Bin.wxs')" />
</Target>

这将在\ dir中的$(Configuration)上运行heat并生成一个wxs文件,包括bin目录中的所有文件。

这样,如果您在 bin 目录中添加或删除任何二进制文件,当您重建安装程序时,它会自动被拾取(如果 Bin.wxs 文件不存在)。

现在您需要确保为 wix 定义变量“BinDir”,它指向构建机器上的 bin 目录。您还需要将 Bin.wxs 文件作为链接添加到您的 wixproj(添加现有文件时,“添加”上有一个小箭头下拉菜单。单击该箭头并选择“添加为链接”。)

我认为 Wix 中的某个地方有一个实际的热目标,但我还没有仔细研究过它,还不知道如何使用它。


0
投票

更新:自 2024 年 3 月 16 日起,这不适用于 WiX 4:https://github.com/tom-englert/Wax/issues/82(谢谢,@hellobody


作为其他答案的替代

有一个名为 Wax 的 Visual Studio 扩展(GitHubVisual Studio Marketplace):

它提供了一种使用 GUI 处理所有所需文件的替代方法。

它可能不像

heat
这样的命令行工具那么复杂,但它更简单,并且当您刚开始学习 WiX 并想要快速入门时,它可以成为一个很好且友好的工具。

© www.soinside.com 2019 - 2024. All rights reserved.