使用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)"/>
但是,如果在每次使用批处理时没有项目时必须明确编写代码,感觉不满意。
答案 0 :(得分:11)
我的2美分:
在“消息任务”中,有来自批处理和静态信息的信息(“颜色:”)。我认为MsBuild打印静态信息,然后批量处理Colors项的值。问题是你的集合中没有任何数据(甚至是未声明的),我想MsBuild将其解释为一个空列表,当你尝试打印它时,打印空字符串''。
如果删除静态内容(“Colors:”和身份前的空格),则不会显示任何内容。
仅当项目集合不为空时才使用批处理进行打印的解决方案是:
检查集合是否为空
<Message Condition="'@(Colors)'!=''" Text="Color: %(Colors.Shade) %(Colors.Identity)"/>
使用Transform [1]
<Message Text="@(Colors->'Color : %(Shade) %(Identity)')"/>
答案 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>