Msbuild 当项目为零时,如何停止项目批处理执行批处理?
使用msbuild执行此操作:Msbuild 当项目为零时,如何停止项目批处理执行批处理?,msbuild,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>
<?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>
都很好,很好,但删除颜色并使用此选项:
<?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)"/>
但是,如果每次使用批处理时都没有项目,则必须显式编写代码,这让if感到不满意。我的2美分:
在消息任务中,有来自批处理的信息和静态信息(“颜色:”)。我认为MsBuild打印静态信息,然后对颜色项的值进行批处理。问题是您的集合中没有任何数据(甚至没有声明),我想MsBuild会将其解释为一个空列表,当您尝试打印它时,它会打印空字符串“”
如果删除静态内容(“颜色:”和标识前的空白),则不会显示任何内容
仅当items集合不为空时使用批处理打印的解决方案为:
<Message Condition="'@(Colors)'!=''" Text="Color: %(Colors.Shade) %(Colors.Identity)"/>
只是想为这个问题添加一个替代解决方案。如果可以将批处理更改为目标批处理,而不是任务批处理,则可以将条件语句添加到目标 我在这里添加了目标批处理:
<?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>
谢谢,这是有用的信息。是的,如果我删除静态位“Colors:”,那么它就可以正常工作了。我实际上是在一个Exec任务中使用它来调用一组文件的命令行工具。这需要一些静态内容才能将参数传递到命令行工具,因此,是的,正如您所说,看起来我只需要非常小心地在我使用此技术的所有地方包括Condition=“”(@Colors)”!=''。
<Message Text="@(Colors->'Color : %(Shade) %(Identity)')"/>
<?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>