扩展程序概览

报告问题 查看源代码 每夜 build · 8.0 · 7.4 · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

本页介绍了如何使用宏和规则扩展 BUILD 语言。

Bazel 扩展程序是指以 .bzl 结尾的文件。使用加载语句从扩展程序导入符号。

在学习更高级的概念之前,请先:

宏和规则

是一种用于实例化规则的函数。如果 BUILD 文件过于重复或过于复杂,此方法非常有用,因为它允许您重复使用某些代码。系统会在读取 BUILD 文件后立即对该函数进行求值。评估 BUILD 文件后,Bazel 对宏的了解很少:如果您的宏生成了 genrule,Bazel 的行为将与您编写 genrule 时一样。因此,bazel query 将仅列出生成的 genrule

规则比宏更强大。它可以访问 Bazel 内部信息,并完全控制正在发生的情况。例如,它可以将信息传递给其他规则。

如果您想重复使用简单的逻辑,请先使用宏。如果宏变得复杂,通常最好将其转换为规则。通常,通过规则即可支持新语言。规则适用于高级用户,大多数用户永远无需编写规则;他们只会加载和调用现有规则。

评估模型

构建过程由三个阶段组成。

  • 加载阶段。首先,加载并评估构建所需的所有扩展程序和所有 BUILD 文件。执行 BUILD 文件只是实例化规则(每次调用规则时,系统都会将其添加到图表中)。这是宏的求值位置。

  • 分析阶段。系统会执行规则的代码(其 implementation 函数),并实例化操作。操作用于说明如何根据一组输入生成一组输出,例如“对 hello.c 运行 gcc 并获取 hello.o”。您必须先明确列出将要生成哪些文件,然后才能执行实际命令。换句话说,分析阶段会获取加载阶段生成的图表,并生成操作图。

  • 执行阶段。当至少需要其中一个输出时,系统会执行操作。如果缺少文件或命令未能生成输出,构建将失败。此阶段还会运行测试。

Bazel 使用并行处理来读取、解析和评估 .bzl 文件和 BUILD 文件。系统每构建一次最多读取一次文件,并且会缓存和重复使用评估结果。只有在文件的所有依赖项(load() 语句)都已解析完毕后,系统才会对该文件进行评估。设计上,加载 .bzl 文件没有任何明显的副作用,它只会定义值和函数。

Bazel 会尽量发挥聪明才智:它会使用依赖项分析来了解必须加载哪些文件、必须分析哪些规则以及必须执行哪些操作。例如,如果某个规则生成的操作对当前 build 来说没有用处,则系统不会执行这些操作。

创建扩展程序

在编写您自己的扩展程序时,以下两个链接会非常有用。将它们放在触手可及的位置:

进一步了解

除了规则之外,您可能还需要编写方面代码库规则