构建文件

报告问题 查看来源 每晚 · 7.2。 · 7.1敬上 · 7.0 · 6.5 · 6.4

前面部分介绍了软件包、目标和标签,以及 抽象化构建依赖关系图。本部分介绍了具体的语法, 来定义软件包

根据定义,每个软件包都包含一个 BUILD 文件,该文件是一个简短的 计划。使用命令式语言评估 BUILD 文件, Starlark

它们会被解释为一系列连续的语句。

一般来说,顺序很重要:必须先定义变量 。不过,大多数 BUILD 文件仅包含 构建规则,这些语句的相对顺序无关紧要;全部 重要的是, 软件包评估完成的时间。

在执行构建规则函数(例如 cc_library)时,它会创建一个 图表中的新目标。此目标日后可以使用标签进行引用。

在简单的 BUILD 文件中,规则声明可以自由重新排序,无需 改变行为。

为鼓励将代码和数据完全分开,BUILD 文件不得 包含函数定义、for 语句或 if 语句(但列出 理解和 if 表达式)。可以在以下位置声明函数: .bzl 文件。此外,*args**kwargs 参数 可在 BUILD 文件中使用;而是明确列出所有参数。

至关重要的是,Starlark 中的程序无法执行任意 I/O。这种不变性 使 BUILD 文件的解释是封闭的 - 仅依赖于已知的 一组输入,这对于确保构建的可重现性至关重要。 如需了解详情,请参阅封闭性

BUILD 文件应仅使用 ASCII 字符写入,但 从技术上讲,它们是使用 Latin-1 字符集解释的。

因为每当 BUILD 文件的依赖项更新时, 因此它们通常由多个用户在同一台计算机上进行维护 团队。BUILD 文件作者应自由添加评论来记录该角色 (无论是否面向公众使用) 说明软件包本身的作用

加载扩展程序

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

load("//foo/bar:file.bzl", "some_library")

此代码会加载文件 foo/bar/file.bzl 并添加 some_library 符号 环境。此库可用于加载新规则、函数或常量 (例如,字符串或列表)。可以使用 为 load 调用添加额外的参数。参数必须是字符串字面量 (无变量)和 load 语句必须出现在顶层,它们不能出现在顶层 位于函数正文中。

load 的第一个参数是一个标签,用于标识 .bzl 文件。如果是相对标签,则根据 包含当前 bzl 文件的软件包(而非目录)。中的相对标签 load 语句应使用前导 :

load 也支持别名,因此,您可以为不同的字段指定不同的名称, 导入符号中。

load("//foo/bar:file.bzl", library_alias = "some_library")

您可以在一个 load 语句中定义多个别名。此外, 参数列表可同时包含别名和常规符号名称。以下 示例完全合法(请注意何时使用引号)。

load(":my_rules.bzl", "some_rule", nice_alias = "some_other_rule")

.bzl 文件中,以 _ 开头的符号不会被导出,因此无法导出 从另一个文件加载的

您可以使用加载可见性来限制 其可能会加载 .bzl 文件。

构建规则的类型

大多数构建规则都属于一个系列,按照 语言。例如:cc_binarycc_librarycc_test 是 C++ 二进制文件的构建规则, 库和测试。其他语言使用相同的设置 具有不同的前缀,例如 java_* 表示 Java。其中部分函数记录在 构建百科全书,但 让任何人都可以创建新规则

  • *_binary 规则用于构建使用给定语言的可执行程序。在 那么可执行文件将位于构建工具的二进制文件中 输出树。 因此 //my:program 将显示在(举例来说)$(BINDIR)/my/program 处。

    在某些语言中,此类规则还会创建一个 runfiles 目录 包含 data 中提及的所有文件 属性或其及物属性中的任何规则 依赖项的闭包;这组文件汇集在 轻松地部署到生产环境

  • *_test 规则是 *_binary 规则的特有,用于自动 测试。测试就是在成功时返回零的程序。

    与二进制文件一样,测试也有 runfile 树和 其下方是测试可能合法打开的唯一文件 。例如,程序 cc_test(name='x', data=['//foo:bar']) 可能会在执行期间打开并读取 $TEST_SRCDIR/workspace/foo/bar。 (每种编程语言都有自己的实用函数, 获取 $TEST_SRCDIR 的值,但它们都是 相当于直接使用环境变量。) 不遵守规则将导致测试在不符合该规则时失败 在远程测试主机上执行测试。

  • *_library 规则指定在给定的 编程语言。库可以依赖于其他库 而二进制文件和测试可以依赖于库, 单独编译行为

<ph type="x-smartling-placeholder"></ph> 标签 <ph type="x-smartling-placeholder"></ph> 依赖项