当前位置: 首页 > 知识库问答 >
问题:

解析Bazel构建事件协议以搜索构建失败的目标和错误消息的最佳方法是什么?

汲涵育
2023-03-14

尽管Bazel在本地构建时会显示构建错误消息,但理解哪个目标在构建图中失败并不容易--默认的错误消息将指向根目标,而不一定是包含错误的目标。这不是最优的,因为在构建图非常大的情况下,用户将不得不构建许多已知是好的目标,直到他们达到坏的目标。

除此之外,从CI获取此消息是不实际的,用户需要滚动数百行(如果不是数千行的话)并搜索错误消息。我想提取构建图失败的确切目标,并获得对错误的有意义的描述,以便将其呈现给开发人员,这样他们就可以在本地快速重现错误并修复他们的更改。

  1. Bazel构建事件协议提供了一组丰富的数据,其中应包含所需的信息;
  2. 在设置Bazel以将构建事件输出到bin文件之后,我创建了一个CLI,它接受这个文件并按照build_event_stream.proto规范解析它;
  3. 解析后,我能得到的最好结果是:
  4. 事件→操作→筛选javac→通过getlabel()获取失败的目标。这并不理想,因为它依赖于过滤javac的结果。在一个大公司里,会有几十个来自不同编程语言的编译器。如果有一种方法以语言不可知的方式获得构建失败的目标,那就太好了;
  5. 事件→进度→筛选srterr非空。显然,进程相当于Bazel打印到终端的消息。使用正则表达式,我可以尝试提取信息,例如出现编译错误的文件、代码行等。尽管此错误消息和失败的目标之间没有联系。
    null

共有1个答案

徐安康
2023-03-14

构建事件协议文件中查找错误的一种半可靠的方法是查找ActionCompletedID事件。根据规范:

报告操作已完成的事件的标识符(不是报告所有操作,只报告那些可以被认为重要的操作;这包括所有失败的操作)。

它附带了一个actionexecuted消息作为有效负载,该消息携带关于操作如何终止的信息,包括它的stderr。虽然规范上说

 类似资料:
  • 我有一个带有tflite模型推断的。cpp代码。此源代码文件是bazel工作区的一部分。我想用默认的桌面编译器和ndk的arm64自定义工具链来构建它,然后在PC和移动上运行它,并比较结果。如何从ndk工具链(someandroidndkpath/toolchains/arm64/bin/clang)中指定自定义编译器? 我在构建文件中有一个简单的目标: 编辑:多亏了@ahumesky,它起作用了

  • 本文向大家介绍android studio更新gradle错误构建项目失败的解决方法,包括了android studio更新gradle错误构建项目失败的解决方法的使用技巧和注意事项,需要的朋友参考一下 一、版本错误 对应版本,修改gradle version,和plusing version两个地方修改gradle version,和plusing version的方法有两种,一种是在 proj

  • 问题内容: 我是NHibernate(和ORMS)的新手,并试图掌握它提供的各种选择。作为参考,我将Fluent NHibernate与单独的业务对象配合使用,而后者又将DTO纯粹用于数据访问。我的应用程序体系结构必须同时支持Windows和Web“前端”。 我的选择是一般方法之一,因为似乎有很多选择。我的DTO看起来像下面的示例。每个DTO都有对ISession的引用,该引用从BO传递给它们。他

  • 问题内容: 我收到此错误: 我正在使用Tomcat 6作为Web服务器。我有两个HTTPS Web应用程序安装在不同端口上但在同一台机器上的不同Tomcat上。说App1(port 8443)和 App2(port 443)。App1连接到App2。当App1连接到App2我得到以上错误。我知道这是一个非常常见的错误,因此在不同的论坛和站点上遇到了许多解决方案。我在server.xml两个Tomc

  • 请帮我解决这个问题。我不知道如何解决这个问题,因为我已经尝试了我所知道的所有方法,但我仍然得到一个梯度错误。 我已经添加了新的系统变量名:_java_options,值:-xmx512m。错误仍然是一样的。如果可以请帮帮我。

  • 我似乎不明白为什么JitPack无法构建我的库,当我检查构建日志时,我发现了以下错误和警告: 我试图通过遵循这个StackOverflow答案中的建议来解决Java版本错误,但它没有起到任何作用。 我做错了什么?我如何修复它?