如何在有零个项目时停止执行批次项目批次?
用的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)"/>
但是,如果在没有项目每次使用配料感觉满意的有明确编写代码的情况。
我的2美分:
在你的消息任务,有一个从配料和静态信息(“颜色”)的信息。我认为MsBuild打印静态信息,然后批量处理您的颜色项目的值。问题在于你的集合中没有任何数据(它甚至没有声明),我想MsBuild将它解释为一个空列表,当你尝试打印它时,打印空字符串''。
如果您删除静态内容(“颜色:”和身份之前的空格),则不会显示任何内容。
一种用批处理打印只有当项目集合不为空将是任何一个解决方案:
-
检查集合为空
<Message Condition="'@(Colors)'!=''" Text="Color: %(Colors.Shade) %(Colors.Identity)"/>
-
使用变换[1]
<Message Text="@(Colors->'Color : %(Shade) %(Identity)')"/>
谢谢,这是有用的信息。是的,如果我删除静态位“颜色:”,那么它确实工作。我实际上是在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>
一个问题很好的问题。 +1 – 2010-11-04 20:52:36