有没有一种方法让msbuild将错误输出写入stderr?

10

看起来msbuild将所有输出(包括错误输出)都写入标准输出。

有没有办法让它将错误输出(通常以红色输出的内容)写入标准错误流中呢?

我正在编写一个带有WPF和控制台界面的.NET应用程序,并使用System.Diagnostics.Process调用msbuild。我希望能够以某种方式区分向用户输出的错误信息。

除了在每一行中查找“error”或直接使用Microsoft.Build +自定义记录器之外,是否有更好的分离输出的方法呢?


我很惊讶地发现这是真的。今天许多可用的构建流水线都依赖于标准错误来停止构建。奇怪的事情。 - Martin
2个回答

11

请查看MSBUILD.EXE命令行参数页面,特别是consoleloggerparameters开关。

您可以使用/clp:ErrorsOnly仅在控制台输出中显示错误。

如果需要其余输出,请附带仅包含错误的文件日志。

/fl4 /flp4:errorsOnly;logfile=MSBuild.Errors.log

然后监视文件以获取新行。


1

我知道你说你想避免使用自定义日志记录器,但是...我也希望能够在标准错误输出中看到错误信息,发现编写自定义日志记录器并不那么痛苦——只需要一个类,一个方法和一条语句:

using Microsoft.Build.Utilities;
using Microsoft.Build.Framework;

public class ErrorOnlyLogger : Logger
{
    public override void Initialize(IEventSource eventSource)
    {
        eventSource.ErrorRaised += (s, e) => {
            System.Console.Error.WriteLine(
                "{0}({1},{2}): error {3}: {4} [{5}]",
                e.File, e.LineNumber, e.ColumnNumber, e.Code, e.Message, e.ProjectFile);
        };
    }
}

这里使用与msbuild相同的错误格式。它可与命令行msbuild 14.0.25420.1一起使用。代码引用C:\Program Files (x86)\MSBuild\14.0\Bin中的Microsoft.Build.Utilities.Core.dll和Microsoft.Build.Framework.dll。我在命令行中添加/logger:ErrorOnlyLogger,path\ErrLogger.dll来调用它。

有趣的建议。我正在尝试解决与问题作者类似的问题,看起来很有前途。对于后续读者的附加信息:https://msdn.microsoft.com/zh-cn/library/ms171471.aspx - Roger Hill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接