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

时间:2016-04-20 22:25:38

标签: wix

我是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

4 个答案:

答案 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="&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 \ 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(GitHubVisual Studio Marketplace)的Visual Studio扩展:

enter image description here

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

它可能不像heat这样的命令行工具那么复杂,但是它要简单得多,并且一开始就可以成为一个不错的友好工具,当您刚开始学习WiX并希望快速入门时。