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

Sco*_*ham 15 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>
Run Code Online (Sandbox Code Playgroud)

它输出:

Color: Dark Blue
Run Code Online (Sandbox Code Playgroud)

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

<?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>
Run Code Online (Sandbox Code Playgroud)

它输出:

Color:
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢.


更新:我发现你可以这样做:

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

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

Ben*_*ann 11

我的2美分:

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

如果删除静态内容("颜色:"和标识前的空格),则不会显示任何内容.

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

  1. 检查集合是否为空

    <Message Condition="'@(Colors)'!=''" Text="Color: %(Colors.Shade) %(Colors.Identity)"/>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用变换[1]

    <Message Text="@(Colors->'Color : %(Shade) %(Identity)')"/>
    
    Run Code Online (Sandbox Code Playgroud)

[1] http://msdn.microsoft.com/en-us/library/ms171476.aspx


小智 5

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

我在这里添加了Target批处理:

<?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>
Run Code Online (Sandbox Code Playgroud)

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

<?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>
Run Code Online (Sandbox Code Playgroud)