当零项目时,如何停止项目批处理执行批处理?

时间:2010-11-04 11:54:52

标签: msbuild

使用msbuild:

执行此操作
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Main" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <ItemGroup>
    <Colors Include="Blue">
      <Shade>Dark</Shade>
    </Colors>
  </ItemGroup>

  <Target Name="Main">
    <Message Text="Color: %(Colors.Shade) %(Colors.Identity)"/>
  </Target>

</Project>

它输出:

Color: Dark Blue

一切都很好,但是删除颜色并使用它:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Main" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <ItemGroup>
  </ItemGroup>

  <Target Name="Main">
    <Message Text="Color: %(Colors.Shade) %(Colors.Identity)"/>
  </Target>

</Project>

它输出:

Color:

为什么当组中没有项目时,会执行一批Message任务?我原本期望零项目,批次将执行零次,我不会看到“颜色:”,输出中没有任何内容。

我做错了什么或有解决办法吗?

感谢。


更新: 我发现你可以做到:

<Message Condition="'@(Colors)'!=''" Text="Color: %(Colors.Shade) %(Colors.Identity)"/>

但是,如果在每次使用批处理时没有项目时必须明确编写代码,感觉不满意。

2 个答案:

答案 0 :(得分:11)

我的2美分:

在“消息任务”中,有来自批处理和静态信息的信息(“颜色:”)。我认为MsBuild打印静态信息,然后批量处理Colors项的值。问题是你的集合中没有任何数据(甚至是未声明的),我想MsBuild将其解释为一个空列表,当你尝试打印它时,打印空字符串''。

如果删除静态内容(“Colors:”和身份前的空格),则不会显示任何内容。

仅当项目集合不为空时才使用批处理进行打印的解决方案是:

  1. 检查集合是否为空

    <Message Condition="'@(Colors)'!=''" Text="Color: %(Colors.Shade) %(Colors.Identity)"/>
    
  2. 使用Transform [1]

    <Message Text="@(Colors->'Color : %(Shade) %(Identity)')"/>
    
  3. [1] http://msdn.microsoft.com/en-us/library/ms171476.aspx

答案 1 :(得分:5)

也想为此添加替代解决方案。如果您可以将批处理更改为目标批处理,而不是任务批处理,则可以将Condition语句添加到目标。

我在这里添加了目标批处理:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Main" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <ItemGroup>
  </ItemGroup>

  <Target Name="Main" Outputs="%(Colors.Identity)">
    <Message Text="Color: %(Colors.Shade) %(Colors.Identity)"/>
  </Target>

</Project>

...并且可以有条件地仅在“颜色”项目组中存在某些内容时执行:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Main" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <ItemGroup>
  </ItemGroup>

  <Target Condition="'@(Colors)'!=''" Name="Main" Outputs="%(Colors.Identity)">
    <Message Text="Color: %(Colors.Shade) %(Colors.Identity)"/>
  </Target>

</Project>