【问题标题】:How to have MSBuild quiet output but with error/warning summary如何让 MSBuild 安静输出但带有错误/警告摘要
【发布时间】:2014-10-23 07:23:39
【问题描述】:

我只是试图从构建中获取任何输出,除了最后的错误/警告摘要。不完全是一项艰巨的任务。

命令行:

msbuild.exe /nologo /verbosity:quiet /consoleloggerparameters:summary project.sln

如此处所述:http://msdn.microsoft.com/en-us/library/ms164311.aspx 似乎 MSBuild 没有正常工作 - 根本没有输出。与 /verbosity:normal 有大量的输出和最后有用的错误/警告摘要,有什么办法只是看不到噪音?

MSBuild 报告版本 12.0.21005.1 与 Studio Express 2013 一起分发。

【问题讨论】:

  • 我查看了文档并看到 Minimal 作为您可以使用的选项?我错了,你试过这个了吗?
  • Minimal 在构建时显示所有文件,它的噪音较小,但也抑制了错误/警告摘要,这是一个非常有用的显示内容。
  • 另一方面,MSBuild 似乎无法正常工作,没有任何地方描述输出应该只是当你给它显示的参数时的摘要跨度>
  • stijn - 我提供的链接中的文档非常清楚,正如我阅读的那样:/clp:Summary。在末尾显示错误和警告摘要。
  • 是的,这是真的 - 但你将它与设置详细程度混合在一起,关于它到底做什么的文档相当模糊(或者甚至可能不存在,至少我从未找到合适的描述)所以你不能期望它只留下你想要的部分

标签: msbuild visual-studio-2013


【解决方案1】:

使用/consoleloggerparameters:ErrorsOnlyclp:ErrorsOnly 来解决您的问题。

【讨论】:

    【解决方案2】:

    迟到了,但 MSBuild 现在有选项 /verbosity:quiet,除了错误和警告之外,它不会打印任何内容。

        You can specify the following verbosity levels: 
        q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic]
    

    文档来源:https://msdn.microsoft.com/en-us/library/ms164311.aspx

    【讨论】:

    • 我使用的是 VS2019 的 MSBuild,/verbosity:quiet 对我没有任何影响
    【解决方案3】:

    请改用/verbosity:minimal。这打印得少得多,但不是什么都没有。

    【讨论】:

    • /verbosity:minimal 不打印错误和警告摘要
    【解决方案4】:

    我认为没有一组选项完全符合您的要求。但是由于无论如何您都在命令行上,因此使用 findstr/grep/tail 之类的总是一个不错的选择。这是一个使用 powershell 显示摘要及其后的内容的示例

    powershell -Command "msbuild.exe /nologo project.sln |
                         Select-String 'Build succeeded|failed' -Context 0, 100"
    

    另一种可能性是使用自定义记录器,这听起来并不难,而且网络上有大量示例。此外,它还有一个好处,您可以获得所需的任何自定义输出。这是复制摘要的代码:

    using System;
    using Microsoft.Build.Utilities;
    using Microsoft.Build.Framework;
    
    public class CustomLogger : Logger
    {
      private int warnings = 0;
      private int errors = 0;
    
      public override void Initialize( IEventSource eventSource )
      {
        eventSource.WarningRaised += ( s, e ) => ++warnings;
        eventSource.ErrorRaised += ( s, e ) => ++errors;
        eventSource.BuildFinished += ( s, e ) =>
        {
          Console.WriteLine( errors == 0 ? "Build succeeded." : "Build failed." );
          Console.WriteLine( String.Format( "    {0} Warning(s)", warnings ) );
          Console.WriteLine( String.Format( "    {0} Error(s)", errors ) );
        };
      }
    }
    

    把它放在一个文件CustomLogger.cs中并编译它:

    csc /t:library CustomLogger.cs /reference:Microsoft.Build.Utilities.v4.0.dll;Microsoft.Build.Framework.dll
    

    创建一个 CustomLogger dll 文件。现在像这样使用它:

    msbuild /nologo /logger:CustomLogger.dll /noconsolelogger project.sln
    

    【讨论】:

    • stijn - 非常感谢您的回答,正如我上面所说,这不是我阅读文档的方式,而是您的回答有效。有必要使用自定义记录器来获取这些信息似乎很奇怪,我原以为这是每个人都需要构建系统的。
    • 对于日志输出之类的东西,我会说 A 想要 X 而 B 想要 Y 等等,所以我的猜测是 MsBuild 想要找到一个中间立场(这恰好不是你想要的特别想要)结合定制
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 2021-12-23
    相关资源
    最近更新 更多