【问题标题】:Is there a way to make msbuild write error output to stderr?有没有办法让 msbuild 将错误输出写入 stderr?
【发布时间】:2013-08-14 15:04:14
【问题描述】:

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

有没有办法让它将错误输出(通常以红色输出)写入标准错误?

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

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

【问题讨论】:

  • 我惊讶地发现这是真的。今天可用的许多构建管道依赖标准错误来停止构建。奇怪的东西。

标签: c# msbuild msbuild-4.0


【解决方案1】:

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

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

如果您需要其余的输出,请在其中包含仅错误文件日志

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

然后监视文件是否有新行。

【讨论】:

    【解决方案2】:

    我知道您说过您想避免使用自定义记录器,但是...我还希望在 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 添加到命令行以调用它。

    【讨论】:

    猜你喜欢
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多