有没有办法让msbuild写入错误输出到stderr?

时间:2013-08-14 15:04:15

标签: c# msbuild msbuild-4.0

似乎msbuild将所有输出(包括错误输出)写入标准输出。

是否有某种方法可以将错误输出(通常以红色输出)写入标准错误?

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

分离输出是否比在每行中查找“错误”或直接使用Microsoft.Build +自定义记录器更好?

2 个答案:

答案 0 :(得分:8)

看看MSBUILD.EXE command line arguments page。特别是consoleloggerparameters开关。

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

如果您需要输出的其余部分,请在“/ fl4 /flp4:errorsOnly;logfile=MSBuild.Errors.log”中包含仅错误文件日志,监视新行的文件。

答案 1 :(得分:1)

我知道你说你想避免使用自定义记录器,但是......我还想在stderr上输出错误并发现编写自定义记录器并不是那么痛苦 - 1个类带有1个方法和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添加到命令行以调用它。