【问题标题】:How to build a PropertyGroup entry from an ItemGroup in MSBuild?如何从 MSBuild 中的 ItemGroup 构建 PropertyGroup 条目?
【发布时间】:2011-03-18 06:50:41
【问题描述】:

我对 MSBuild 非常陌生,无法弄清楚如何从条件部分构造 PropertyGroup 条目。

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

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

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

如果 SomeFlag 设置为 true,我希望定义的常量显示为 DEBUG_PARANOID;DEBUG;TRACE,否则忽略 DEBUG_PARANOID。顺便说一下,这是针对 .csproj 的。

如果我用消息任务打印出@(CompilerDirective),它就可以工作。

我的问题是如何在 PropertyGroup 条目中进行这项工作?

【问题讨论】:

  • 顺便说一句:从 ItemGroups 构造属性的方式很糟糕。只需从其他属性构建一个属性。这样就容易多了。
  • ItemGroups 是指向文件,而不是任意字符串。

标签: msbuild


【解决方案1】:

你上面的作品。我跑了这个:

<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>

并得到正确的输出 调试;跟踪 或者 DEBUG_PARANOID;调试;跟踪 取决于财产的价值。这在哪些方面对您不起作用?

【讨论】:

  • 好吧,那怎么样.. 好吧,我认为它不起作用的原因是,当我查看 VS 中的构建属性时,它们会以 @(CompilerDirective) 的形式出现,而不是扩展列表。我以为它会扩展它,因为它还会扩展USER_$(USERNAME.ToUpper())(在我的示例中我省略了它以减少噪音)。好的,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-27
  • 1970-01-01
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多