如何在wix安装程序中以智能方式包含热量生成的wsx文件?

时间:2014-05-28 19:26:28

标签: wpf msbuild wix wix-extension

它是一个WPF应用程序,带有Wix Installer。

我有resourceses文件夹,我想在安装程序中包含这些文件以放在可执行文件旁边。我解决了使用resources.wxs工具生成resources文件,其中包含有关heat文件夹下文件的必要信息。我设法包含在主wxs文件中。出于这个原因,我修改了.wixproj文件,添加了一个之前的构建目标操作来生成wx并将其包含在主wxs中。

关注:.wixproj是一种隐藏的东西,你无法从visual studio修改,比如添加一个before build动作(pre build action是另一个故事)

问题:如何将之前的构建操作提取到单独的文件中?

.wixproj中的之前构建操作:

<Target Name='BeforeBuild'>
<Exec Command='"%WIX%bin\heat" dir $(SolutionDir)resources -dr ResourcesDir -var var.ResourcesDir -cg ResourceFilesGroup -gg -g1 -sfrag -srd -out $(ProjectDir)Resources.wxs' />
<ItemGroup>
  <Compile Include='$(ProjectDir)Resources.wxs' />
</ItemGroup>

1 个答案:

答案 0 :(得分:2)

您可以将其提取到单独的文件中 - 大多数项目文件类型已经这样做了。这就是他们为一种类型的所有项目提供共同目标的方式。 .wixproj有这个:

<Import Project="$(WixVersionTargetsPath)" />

要扩充自己,只需:

创建一个XML文件,如:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">    
   <Target Name='BeforeBuild'>
        <!-- tasks -->
    </Target>
</Project>

在Project元素中添加一个Import元素并引用该文件:

<Import Project="custom.targets" />

如果此类文件主要包含Target元素,则其约定是文件扩展名为“.targets”。

但Visual Studio有两个缺点:

  1. Visual Studio缓存所有项目文件依赖项并在内部运行MSBuild。因此,在编辑外部文件时,在下次加载项目之前,它不会是使用Visual Studio构建的一部分。要快速卸载和重新加载项目,请使用解决方案资源管理器中的项目上下文菜单。解决方法:自己调用MSBuild。
  2. 当Visual Studio加载项目时,如果它包含非标准外部文件,则会发出警告。 (如果我记得的话,您可以在注册表中按项目文件路径按用户禁用它。)

  3. 作为直接调用热量的替代方法,您可能希望查看WiX提供的Harvest *目标。注意:正如文档所说,你不直接调用它们(它们已经被Build目标调用);您只需将项目添加到他们处理的ItemGroup并设置他们使用的属性。