【问题标题】:Include all Files in Bin folder in Wix installer在 Wix 安装程序中包含 Bin 文件夹中的所有文件
【发布时间】:2016-08-13 20:53:14
【问题描述】:

我是 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 表中。

【问题讨论】:

  • 您是否尝试向组件 Id="CopyComponent" 添加 KeyPath="ÿes" 属性?
  • 我建议你使用加热工具而不是这种复制方法。
  • 你的问题解决了吗?

标签: wix


【解决方案1】:

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

【讨论】:

  • 对我来说,这导致了 HEAT5052 错误找不到“部署”目录。解决方案是在 heat 命令运行时进行更改,如下所述:stackoverflow.com/questions/34282907/…
  • 像魅力一样工作。如果您不想指定两次相同的“部署”路径,您可以定义一次属性(在PropertyGroup 部分中)并在项目文件中多次引用它(如$(MyDeployPath))。
  • 花了很多时间试图理解它是如何工作的,阅读了很多教程和文章,但你的描述是迄今为止最好的!
  • 它有效,但我不明白为什么 HarvestPath 常量中有 3 个点,或者为什么它不能在 HeatDirectory.Directory 属性中重复使用。
  • 不复制原始路径的一种便捷方法是将路径设置为属性并将该属性包含为常量 ..\somepathPropertyName1=$( PropertyName1);PropertyName2=$(PropertyName2);
【解决方案2】:

如果你不介意我这么说的话,我觉得你有点糊涂了。

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 工具用作支架,但除了学习语言并使用它之外,没有其他替代方法。尝试使用自动生成的代码来做事可能会带来一些微妙的问题,而且使用静态列表总是更简单。

【讨论】:

  • 我从这一行中得到了启发:“CopyFile will copy a file will copy a file...”
【解决方案3】:

我在安装过程中执行了与您在此处所需的操作类似的操作。我需要复制一个包含 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>

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

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

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

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

【讨论】:

    【解决方案4】:

    作为其他答案的替代

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

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

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

    【讨论】:

    • 这完全是浪费时间,它只显示警告符号,不让我打开或选择任何东西。
    • @PaulMcCarthy,我用它来加速创建我的 WiX 安装程序。以我的经验,它运作良好:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 2012-06-21
    • 1970-01-01
    相关资源
    最近更新 更多