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>

使用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>
都很好,很好,但删除颜色并使用此选项:

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