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
相关产品推荐
相关产品推荐

