如果 exitCode = 0 但有记录到标准错误,msbuild 中的 Exec 任务是否会失败?

Can Exec task in msbuild fail if exitCode = 0 but there is logging to standard error?

我很好奇:

https://docs.microsoft.com/en-us/visualstudio/msbuild/exec-task?view=vs-2019

ExitCode 可选 Int32 输出只读参数。

指定执行的命令提供的退出代码,但如果任务记录了任何错误,但进程的退出代码为 0(成功),则 ExitCode 设置为 -1。

即使进程的退出代码为 0 但它记录到标准错误,msbuild 能否在 Exec 上失败?

我尝试使用以下代码使其失败:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp3
{
   class Program
   {
      static int Main( string[] args )
      {
         using ( var stdErr = Console.Error )
         {
            for ( int i = 0; i <= 100; i++ )
            {
               stdErr.WriteLine( $"Failed to copy attempt {i}." );
               System.Threading.Thread.Sleep( 50 );
            }

            // Close redirected error stream.
            Console.Error.Close();
         }
         return 0;
      }
   }
}

它作为标准道具文件的一部分被调用。

   <Target 
          Name = "IvaraSign"
          AfterTargets="CoreBuild"
          BeforeTargets="CopyFilesToOutputDirectory" >
     <!-- Update version on main output -->
     <!-- this works when the solution being compiled is in the dotnet folder. -->
     <Exec Command="C:\Users\Derek.Morin\source\repos\ConsoleApp3\bin\Debug\ConsoleApp3.exe"/>
  </Target>

当我在 msbuild 中构建时,我可以在构建输出中看到错误文本,但编译通过了。

我能够通过以下方式复制使 exec 文件失败

  static int Main( string[] args )
  {
     using ( var stdErr = Console.Error )
     {
        stdErr.WriteLine( $@"signtool.exe : error information: ""Error: Store IsDiskFile() failed."" (-2147024864/0x80070020) [d:\work\s\common\MAFPlugins\MAFScripting\Contracts\Contracts.csproj]" );
     }
     Console.WriteLine( "but I'm still going to return 0" );
     return 0;
  }

解决方法是使用 IgnoreStandardErrorWarningFormat="true"。

<Exec Command="C:\ConsoleApp3\ConsoleApp3.exe" IgnoreStandardErrorWarningFormat="true" />