【问题标题】:Bazel build file introspectionBazel 构建文件自省
【发布时间】:2019-10-17 08:55:15
【问题描述】:

是否有任何工具可用于内省 Bazel 构建文件的集合以针对代码库运行查询?我正在考虑收集代码库中使用的所有已定义标签的简单案例。某种 bazel 元查询功能,可以让我在包含大量构建文件的 repo 中确定约定和用法。

如果能够针对它们的集体标签对cc_testpy_test 规则进行交叉制表,那就太好了。理想情况下,应该有一个 python 客户端来检查 bazel 文件。

【问题讨论】:

  • 这个想法是否类似于 graphql 查询,我从查询中提取所有逐项点击,然后由我将这些数据汇总成更能说明问题的内容?考虑到我可以针对 startlark/bazel 语法中的任意构造,这可能是站得住脚的,根据可能的查询 functions 的集合,快速浏览似乎涵盖了大部分基础。我还没有完全熟悉 bazel,还没有想到一个我无法查询的反例,它是在 bazel 文件中定义的。
  • 也许另一种说法是找到某种方法来跳入一个starlark interpreter 会话并使用typedir 命令来执行它,就像在Python 加载中所做的那样模块和四处寻找。我不确定在该会话中加载构建文件的类似入口点是什么,但这是一个有趣的想法。
  • 我想知道 load statement 是否是 bazel 查询范围之外的一个很好的例子;例如,查找所有加载特定符号的构建文件,类似于这些行。

标签: bazel


【解决方案1】:

bazel query 使用高度表达的查询语言提供有关目标依赖关系图的信息。它可以输出为各种格式,如 DOT、XML、Protobuf,以及扩展的 BUILD 文件本身的文本表示(如果有宏)用于后处理。请参阅:Bazel query how-toBazel query reference

bazel cqueryquery 的作用相同,但也执行分析阶段,该阶段计算目标依赖图上的配置信息(例如 CPU、API 级别)。这需要稍长的时间,但可以更准确地表示 Bazel 为执行阶段带来的图表。见:Bazel cquery reference

bazel aquery 与 BUILD 文件自省没有直接关系,因为它提供有关可执行操作的信息,这是在 BUILD 文件解析和分析之后的几层计算。见:Bazel aquery reference

querycqueryaquery 不对 BUILD 文件的语法进行操作。如果您想使用 Starlark 语法 / AST,请查看 bazelbuild/buildtools 存储库中的 buildozerbuildifier 工具。

如果使用这些机制无法检索有关您的构建图的信息,请在 Bazel GitHub 项目上提交功能请求。

【讨论】:

  • 非常有趣,看起来所有这些 buildtools 主要是用 go 编写的,并且 buildifier 和 buildozer 确实提供了很好的示例,以构建在 github.com/bazelbuild/buildtools/tree/master/build 中定义的基本 starlark 词法分析和解析功能。看来要进行构建文件分析,我需要掌握一些 go 技能。
  • 找到了这个 lil nugget github.com/google/starlark-go,当我在 buildtools 下搜索 starlark 导入时,我发现了这个美丽 buildifier2.go。那里有一个很棒的文档字符串 ...使用 go.starlark.net/syntax 中的 AST。这将为我们提供更精确的 AST,并允许我们与 Skylark 解释器共享代码。最终目标是构建一系列能够解析、分析、格式化、重构、评估 Skylark 代码的工具。
猜你喜欢
  • 1970-01-01
  • 2018-02-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-01
  • 1970-01-01
  • 2023-01-04
  • 2020-10-09
  • 2019-12-19
相关资源
最近更新 更多