在自定义构建工具VS2012 MSBuild中使用过滤器元数据

时间:2015-03-11 10:25:51

标签: visual-studio visual-studio-2012 msbuild msbuild-task custom-build

我有一个问题,我想要很好地解决,但现在不知道该怎么做。

在我的C ++解决方案(VS2012)中,我有一个项目,其中包含所有.dll文件,这些文件必须复制到输出目录中才能完成部署。我还写了一个小的自定义工具来进行复制。

实际问题是我们必须为不同的配置部署不同的.dll(Win32 / x64 / Debug / Release),我们必须手动为每个文件和每个配置设置ExcludedFromBuild属性。我想根据文件所在的过滤器自动设置此属性。为了更好地查看为哪个配置复制了哪个.dll,我已将它们组织在具有以下结构的过滤器中。

  • 的Win32
    • 调试
    • 推出
  • 64
    • 调试
    • 推出

当我查看vcxproj.filters文件时,条目如下所示。

<CopyFiles Include="..\bin.x64\icudt54d.dll">
  <Filter>x64\Debug</Filter>
</CopyFiles>

所以我想,我应该可以使用%(CopyFiles.Filter)

访问我的复制目标中的过滤器
<Target Name="AddInputsAccordingToFilter">
  <ItemGroup>
    <CopyFiles Include="@(CopyFiles)" Condition="%(CopyFiles.Filter.StartsWith('$(Platform)') And %(CopyFiles.Filter.EndsWith('$(Configuration)')"/>
  </ItemGroup>
</Target>

但这从未奏效,在尝试找出问题时,我发现%(CopyFiles.Filter)始终为空,因为.vcxproj.filters未在.vcxproj文件中导入。我尝试手动将导入添加到.vcxproj.filters文件,但随后Visual Studio中的过滤器完全搞砸了。

有没有人知道如何在不弄乱Visual Studio项目的情况下自动执行此过程?

1 个答案:

答案 0 :(得分:2)

.filters文件不参与构建过程,但可以通过XmlPeek任务查询任何xml文件。请尝试以下方法:

<Target Name="AddInputsAccordingToFilter">
  <XmlPeek Namespaces="&lt;Namespace Prefix='n' Uri='http://schemas.microsoft.com/developer/msbuild/2003'/&gt;"
             XmlInputPath="$(MSBuildProjectFile).filters"
             Query="/n:Project/n:ItemGroup/n:CopyFiles[starts-with(n:Filter, '$(Platform)')]/@Include">
    <Output TaskParameter="Result" ItemName="FilesToCopy" />
  </XmlPeek>
  <ItemGroup>
    <CopyFiles Include="@(FilesToCopy)"/>
  </ItemGroup>    
</Target>

考虑到此解决方案依赖于未记录的.filter文件格式。