如何使用WiX获取XNA内容文件?

时间:2012-07-02 01:41:05

标签: xna wix build-automation

理想情况下,我会从项目规范中获取输出,但是heat.exe似乎不支持contentproj个文件作为项目类型,如果我传入的话,它也不会获取内容游戏的主要csproj

目前我有一个预编译步骤,在输出文件夹上调用heat,但是(a)感觉很脏,并且(b)产生一堆引用相对于输出文件夹的源路径的File标签,如果相对于WiX项目的文件夹找不到它们,则构建失败。

我应该注意到我正在使用Votive,我的项目布局如下:

- Main solution
 - XNA "Metaproject" Folder
  - Game
   - bin/x86/Release (GameContent output appears here)
  - GameContent
 - WiX Project

我非常希望尽量减少指定"../../Game/Game/bin/x86/Release/Content"这样的路径的次数,因为这很容易出错并且输入很难。正确方向的产品值得赞赏!

1 个答案:

答案 0 :(得分:2)

假设contentproj只是一个文件集合,您可以做的是直接在创建安装程序的wixproj中添加收获:

<PropertyGroup>
    <HarvestDirectoryNoLogo>true</HarvestDirectoryNoLogo>
    <HarvestDirectorySuppressFragments>true</HarvestDirectorySuppressFragments>
    <HarvestDirectorySuppressUniqueIds>true</HarvestDirectorySuppressUniqueIds>
    <HarvestDirectoryAutogenerateGuids>true</HarvestDirectoryAutogenerateGuids>
</PropertyGroup>
<ItemGroup>
    <HarvestDirectory Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' " 
                      Include="$(SolutionDir)\GameContent">
        <DirectoryRefId>INSTALLDIR</DirectoryRefId>
        <SuppressRootDirectory>true</SuppressRootDirectory>
        <PreprocessorVariable>var.GameContentDir</PreprocessorVariable>
        <ComponentGroupName>GameContent</ComponentGroupName>
    </HarvestDirectory>    
</ItemGroup>

您需要手动将其添加到wixproj文件中,如果需要多个目录,可以为每个目录重复HarvestDirectory。

要设置var.GameContentDir预处理器变量,请编辑DefineConstants属性:

<DefineConstants>GameContentDir=$(GameContentDir);</DefineConstants>

将预处理器var设置为msbuild属性:

<GameContentDir>$(SolutionDir)\GameContent</GameContentDir> 

这意味着您可以根据构建配置修改此依赖项。如果您不需要修改路径,只需在<DefineConstants>属性中设置静态值。

然后,这会在每个构建的obj目录中生成一个wxs文件,然后假定您已包含ComponentGroupName。如果你包含了之前在wixproj中生成的那个,那么删除它,因为如果ComponentGroupName是相同的,你将会遇到冲突。