You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MSBuild的Exec任务退出码为0但输出到stderr时是否会执行失败?

MSBuild Exec任务 stderr 输出不触发构建失败的原因说明

核心误解澄清

你对官方文档中「任务记录了任何错误」的定义存在偏差:这里的错误指的是Exec任务主动向MSBuild构建日志系统提交了Error级别的日志事件,而非子进程向标准错误流(stderr)输出普通文本。
默认情况下,Exec任务仅在以下两种场景下会记录Error事件、将ExitCode置为-1并标记任务失败:

  • 子进程返回非0的退出码
  • 子进程输出的stderr内容严格匹配MSBuild官方定义的错误日志格式,被识别为正式构建错误

测试场景未触发失败的原因

你编写的测试程序输出的Failed to copy attempt {i}.属于普通stderr文本,不符合MSBuild错误格式规范,因此MSBuild只会将其原样打印到构建输出中,不会触发Error事件,子进程返回0的情况下Exec任务会被判定为执行成功,整个构建流程自然不会中断。

复现预期失败场景的两种方案

方案1:修改测试程序输出符合MSBuild规范的错误信息

MSBuild默认可识别以error :开头的stderr输出为正式错误,修改测试代码的输出逻辑即可:

stdErr.WriteLine($"error : Failed to copy attempt {i}.");

此时即使子进程返回0,Exec任务也会识别到错误事件,将ExitCode设为-1并判定任务失败,中断构建。

方案2:为Exec任务开启stderr全量判定失败开关

给Exec任务添加FailOnStandardError="true"属性,开启后只要子进程向stderr输出了任何内容,无论格式是否符合规范,就算退出码为0,Exec任务都会直接判定为失败:

<Target 
  Name = "IvaraSign"
  AfterTargets="CoreBuild"
  BeforeTargets="CopyFilesToOutputDirectory" >
  <Exec 
    Command="C:\Users\Derek.Morin\source\repos\ConsoleApp3\bin\Debug\ConsoleApp3.exe"
    FailOnStandardError="true"
  />
</Target>

内容的提问来源于stack exchange,提问作者Derek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 23:09:03