如何在有零个项目时停止执行批次项目批次?

问题描述:

用的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 Condition="'@(Colors)'!=''" Text="Color: %(Colors.Shade) %(Colors.Identity)"/> 

但是,如果在没有项目每次使用配料感觉满意的有明确编写代码的情况。

+0

一个问题很好的问题。 +1 – 2010-11-04 20:52:36

我的2美分:

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

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

一种用批处理打印只有当项目集合不为空将是任何一个解决方案:

  1. 检查集合为空

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

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

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

+0

谢谢,这是有用的信息。是的,如果我删除静态位“颜色:”,那么它确实工作。我实际上是在Exec任务中使用它来为一组文件调用命令行工具。这需要一些静态内容让参数传递给命令行工具,所以是的,正如你所说,看起来我只需要非常小心地将Condition =“'(@ Colors)'!=''”包含在内我使用这种技术的地方。 – 2010-11-05 09:29:15

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

我添加了目标配料这里:

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