msbuild - 在msbuild中过滤项目的元数据

标签 msbuild

我想使用修改后的元数据创建一个新的项目集合。 例如,更改 ClCompile.AdditionalIncludeDirectories 的分隔符。 为此,我首先从AdditionalIncludeDirectories 元数据创建一个项目集合,然后对其进行转换:

<ItemGroup>
  <IncludeDirs0 Include="%(ClCompile.AdditionalIncludeDirectories)">
    <key>@(ClCompile)</key>
  </IncludeDirs0>
</ItemGroup>

<ItemGroup>
  <IncludeDirs Include="@(IncludeDirs0 -> '-I %(Identity)', ' ')">
    <key>%(IncludeDirs0.key)</key>
  </IncludeDirs>
</ItemGroup>

<ItemGroup>
  <Compile Include="@(ClCompile)">
    <IncludeDirs>@(IncludeDirs)</IncludeDirs>
  </Compile>
</ItemGroup>

问题是如何过滤编译项组上的 IncludeDirs,以便每个编译项都有其正确的包含目录。 (这样 ClCompile 标识等于 IncludeDirs 键)。 我尝试添加一个条件,例如:Condition="'%(IncludeDirs.key)'=='%(ClCompile.Identity)'"但没有任何成功。
我可以直接使用 IncludeDirs: <Message Text="%(IncludeDirs.key) : @(IncludeDirs)"/>但我觉得这没有捕获要点,因为 Compile 集合应该包含所有元数据。

我在这里错过了什么?

最佳答案

您可以使用一个额外的目标来收集所需的元素。 请参阅MSBuild Batching .

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <ClCompile Include="1" />
    <ClCompile Include="2">
      <AdditionalIncludeDirectories>2.1;2.2;2.3</AdditionalIncludeDirectories>
    </ClCompile>
  </ItemGroup>              

  <Target Name="TransformClCompile"
          Inputs="%(ClCompile.Identity)"
          Outputs="_Non_Existent_Item_To_Batch_">
    <PropertyGroup>
        <IncludeDirs>%(ClCompile.AdditionalIncludeDirectories)</IncludeDirs>
    </PropertyGroup>
    <ItemGroup>
          <IncludeDirs Include="$(IncludeDirs)" />
          <Compile Include="@(ClCompile)">
            <IncludeDirs>@(IncludeDirs ->'-I %(Identity)', ' ')</IncludeDirs>
          </Compile>
    </ItemGroup>                
  </Target>

  <Target Name="Build" DependsOnTargets="TransformClCompile">
     <Message Text="compile %(Compile.Identity) %(Compile.IncludeDirs)" />
  </Target>
</Project>

输出:

  compile 1 
  compile 2 -I 2.1 -I 2.2 -I 2.3

关于msbuild - 在msbuild中过滤项目的元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5016283/

相关文章:

reporting-services - 如何使用 TeamCity 自动部署/构建 SSAS 和 SSRS 解决方案

c# - 在 Visual Studio App Center for Xamarin iOS : Unsafe code may only appear if compiling with/unsafe 中构建失败

c# - Visual Studio、MSBuild 和 CSC 之间有什么关系?

azure - 用于 Selenium 测试的 Team Foundation 服务器自定义托管构建 Controller

msbuild - 查找 TeamCity Agent 的工作路径以在 MSBuild 脚本中使用

c# - Web 部署项目是否使用 x86 构建配置

msbuild - 如何使用 MSBuild ItemGroups 在 "loop"中执行 EXEC 任务?

.net - 如何强制使用MSBuild版本?

MSbuild,如何访问内联任务代码中的项目属性值?

c++ - 在没有安装 Qt VS Tools 的情况下编译 Qt/MsBuild 格式的 Qt 项目