如何从MSBuild中的ItemGroup构建PropertyGroup条目?

如何从MSBuild中的ItemGroup构建PropertyGroup条目?,msbuild,Msbuild,我对MSBuild非常陌生,很难理解如何从条件部分构造PropertyGroup条目 以下是我所拥有的,但不起作用: <ItemGroup> <CompilerDirective Include="DEBUG_PARANOID" Condition=" '$(SomeFlag)' == 'true' "/> <CompilerDirective Include="DEBUG"/> <CompilerDirective Includ

我对MSBuild非常陌生,很难理解如何从条件部分构造PropertyGroup条目

以下是我所拥有的,但不起作用:

<ItemGroup>
    <CompilerDirective Include="DEBUG_PARANOID" Condition=" '$(SomeFlag)' == 'true' "/>
    <CompilerDirective Include="DEBUG"/>
    <CompilerDirective Include="TRACE"/>
</ItemGroup>

<PropertyGroup>
    ...
    <DefineConstants>@(CompilerDirective)</DefineConstants>
    ...
</PropertyGroup>

...
@(编者指导)
...
我希望得到定义的常量显示为DEBUG_PARANOID;调试;如果SomeFlag设置为true,则跟踪,如果未设置,则忽略DEBUG_PARANOID。顺便说一下,这是给a.csproj的

如果我用消息任务打印@(CompilerDirective),它会工作


我的问题是如何在PropertyGroup条目中执行此操作?

上面的内容可以执行。我运行了以下命令:

<Target Name="Test">
  <ItemGroup>
      <CompilerDirective Include="DEBUG_PARANOID"
        Condition=" '$(SomeFlag)' == 'true' "/>
      <CompilerDirective Include="DEBUG"/>
      <CompilerDirective Include="TRACE"/>
  </ItemGroup>
  <PropertyGroup>
    <DefineConstants>@(CompilerDirective)</DefineConstants>
  </PropertyGroup>
  <Message Text="$(DefineConstants)" />
</Target>

@(编者指导)
并得到了正确的输出 调试;痕迹 或 偏执狂;调试;痕迹
取决于属性的值。这在什么方面对你不起作用?

好吧,那怎么样。。好的,我认为它不起作用的原因是,当我在VS中查看构建属性时,它们会以@(CompilerDirective)的形式出现,而不是扩展列表。我假设它会扩展它,因为它也会扩展
USER_$(USERNAME.ToUpper())
(在我的示例中,我省略了它以减少噪音)。好的,谢谢你!顺便说一句:从ItemGroups构造属性是不好的形式。只需从其他属性构造一个属性。这样就容易多了。ItemGroups指向文件,而不是任意字符串。