前面部分介绍了软件包、目标和标签,以及 抽象化构建依赖关系图。本部分介绍了具体的语法, 来定义软件包
根据定义,每个软件包都包含一个 BUILD
文件,这是一个简短的
计划。
使用命令式语言评估 BUILD
文件,
Starlark。
它们被解释为依序语句列表。
一般来说,顺序很重要:必须先定义变量
示例。不过,大多数 BUILD
文件仅包含
构建规则,这些语句的相对顺序无关紧要;全部
重要的是,
软件包评估完成的时间。
在执行构建规则函数(例如 cc_library
)时,它会创建一个
图表中的新目标。此目标日后可以使用标签进行引用。
在简单的 BUILD
文件中,规则声明可以自由重新排序,无需
改变行为。
为鼓励将代码和数据完全分开,BUILD
文件不得
包含函数定义、for
语句或 if
语句(但列出
理解和 if
表达式)。可以在以下位置声明函数:
.bzl
文件。此外,*args
和 **kwargs
参数
可在 BUILD
文件中使用;而是明确列出所有参数。
至关重要的是,Starlark 中的程序无法执行任意 I/O。这种不变性
使 BUILD
文件的解释是封闭的 - 仅依赖于已知的
一组输入,这对于确保构建的可重现性至关重要。
如需了解详情,请参阅Hermeticity。
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_binary
、cc_library
和 cc_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> 依赖项 |