标签

<ph type="x-smartling-placeholder"></ph> 报告问题 查看来源 敬上 每晚 · 7.3。 · 7.2 条 · 7.1 · 7.0 · 6.5

标签是目标的标识符。完整规范的典型标签 格式如下:

@@myrepo//my/app/main:app_binary

标签的第一部分是代码库名称 @@myrepo。双 @ 语法表示这是一个规范代码库 名称,该名称在 工作区。包含规范代码库名称的标签可明确识别目标 无论它们出现在什么情境中

通常,规范化代码库名称是一个迷惑性字符串,类似于 @@rules_java++toolchains+local_jdk。更常见的是 具有明显代码库名称的标签, 如下所示:

@myrepo//my/app/main:app_binary

唯一的区别是代码库名称的前缀是一个 @,而不是两个。 表示具有表观名称 myrepo 的代码库,该名称可能不同 将会根据此标签所在的上下文进行选择。

在典型情况下,标签所引用的 但代码库名称部分可以省略。在 @@myrepo 中,第一个 标签通常写为

//my/app/main:app_binary

标签的第二部分是不符合条件的软件包名称 my/app/main,软件包的路径 代码库根目录的相对路径代码库名称和 非限定的软件包名称,应改为完全限定的软件包名称 @@myrepo//my/app/main。当标签指代同一个 使用它的软件包、软件包名称(以及可选的冒号) 可以省略。因此,在 @@myrepo//my/app/main 内, 此标签可采用以下两种方式之一编写:

app_binary
:app_binary

根据惯例,文件应省略冒号, 但会依据规则保留,但在其他方面并不重要。

英文冒号后面的部分,app_binary 是不符合条件的目标 名称。当它与软件包路径的最后一个组成部分匹配时,它以及 冒号,可以省略。因此,以下两个标签是等效的:

//my/app/lib
//my/app/lib:lib

软件包的子目录中文件目标的名称是文件的路径。 相对于软件包根目录(包含 BUILD 文件的目录)的路径。因此, 此文件位于代码库的 my/app/main/testdata 子目录中:

//my/app/main:testdata/input.txt

//my/app@@some_repo//my/app 等字符串有两个含义,具体取决于 标签的使用环境:当 Bazel 需要标签时, //my/app:app@@some_repo//my/app:app。但是,当 Bazel 需要软件包(例如在 package_group 规范中),则应引用 包含该标签的软件包。

BUILD 文件中的一个常见错误是使用 //my/app 引用软件包,或者 应用于软件包中的所有目标,但实际上不是。请注意, 等同于 //my/app:app,因此它会在 my/app 中指定 app 目标 当前代码库的基础版本

不过,在使用 //my/app 来引用软件包时, package_group规范或.bzl文件中 用于表明软件包名称是绝对名称且位于顶级目录 目录。

相对标签不能用于引用其他软件包中的目标;该 在这种情况下,必须始终指定代码库标识符和软件包名称。 例如,如果源代码树同时包含软件包 my/app 和 软件包 my/app/testdata(这两个目录中的每一个都有自己的 BUILD 文件),后者的软件包包含名为 testdepot.zip 的文件。在这里 引用该文件的方式有两种(一种错误,一种正确) //my/app:BUILD:

错误 - testdata 是不同的软件包,因此您无法使用相对路径

testdata/testdepot.zip

正确 - 请参阅 testdata 的完整路径

//my/app/testdata:testdepot.zip

@@// 开头的标签是对主 代码库(即使从外部代码库也仍然有效)。 因此,@@//a/b/c 不同于 //a/b/c(在从外部代码库引用时)。 前者指代主仓库,而后者指代主仓库 在外部代码库本身中查找 //a/b/c。 在主 引用主代码库中目标的代码库,并将 存储的数据。

有关引用目标的不同方法,请参阅 目标模式

标签的词汇规范

标签语法不建议使用对 shell。这有助于避免无意中引用问题,并使 构建用于操控标签的工具和脚本,如 Bazel 查询语言

以下是允许使用的目标名称的准确详细信息。

目标名称 - package-name:target-name

target-name 是软件包中目标的名称。规则名称 是 BUILD 中规则声明的 name 属性的值 file;文件名就是相对于包含 BUILD 文件。

目标名称必须完全由从 a - z 字符集中提取的字符组成, AZ09 和标点符号 !%-@^_"#$&'()*-+,;<=>?[]{|}~/.

文件名必须是正常形式的相对路径名,这意味着它们必须 开头和结尾都不是正斜杠(例如 /foofoo/ 是 也不允许包含多个连续斜杠作为路径分隔符 (例如 foo//bar)。同样,上层引用 (..) 和 禁止使用当前目录引用 (./)。

错误 - 请勿使用 .. 引用其他软件包中的文件

正确 - 请使用 //package-name:filename

虽然在文件目标的名称中使用 / 很常见,但请避免使用 /。尤其是当标签的简写形式为 可能会让读者感到困惑标签 //foo/bar/wiz 始终是一个简写形式 对于 //foo/bar/wiz:wiz,即使没有这样的软件包 foo/bar/wiz;它 绝不会引用 //foo:bar/wiz,即使该目标存在也是如此。

不过,在某些情况下,使用斜杠非常方便,或者 有时甚至必要例如,特定规则的名称必须与 其主要源文件,该文件可能位于软件包的子目录中。

软件包名称 - //package-name:target-name

软件包的名称是其 BUILD 文件所在目录的名称。 (相对于所属代码库的顶级目录) 例如:my/app

在技术层面上,Bazel 能够执行以下任务:

  • 软件包名称允许使用的字符为小写字母 az, 大写字母 AZ、数字 09, 字符! \"#$%&'()*+,-.;<=>?@[]^_`{|}(没错,这里还有一个空格字符 就是正斜线/(因为它是目录 分隔符)。
  • 软件包名称不得以正斜杠字符 / 开头或结尾。
  • 软件包名称不得包含子字符串 //。这不会使 对应的目录路径是什么?
  • 软件包名称不得包含子字符串 /.//..//.../ 等。 这一要求是为了避免在进行逻辑转换时造成混淆 软件包名称和物理目录名称,且提供 路径字符串中的点字符。

在实践的层面上:

  • 适用于目录结构对其模块非常重要的语言 系统(例如 Java),请务必选择 相应语言的有效标识符。例如,切勿以 并避免使用特殊字符,尤其是下划线和连字符。
  • 尽管 Bazel 支持工作区根软件包中的目标(例如, //:foo),最好将该软件包留空,以便所有有意义的软件包 都没有描述性的名称

规则

规则指定了输入和输出之间的关系, 构建输出的步骤。规则可以属于 种类(有时称为规则类),用于生成经过编译的 可执行文件和库、测试可执行文件以及其他支持的 如构建百科全书中所述。

BUILD 文件通过调用规则来声明目标。

在以下示例中,我们看到目标 my_app 的声明 使用 cc_binary 规则。

cc_binary(
    name = "my_app",
    srcs = ["my_app.cc"],
    deps = [
        "//absl/base",
        "//absl/strings",
    ],
)

每个规则调用都有一个 name 属性(必须是有效的 <目标名称>),用于在软件包中声明目标 (位于 BUILD 文件内)。

每条规则都有一组属性;为指定的 而每个属性的重要性和语义都是 规则的类型请参阅构建百科全书 规则及其相应属性的列表。每个属性都有一个名称 一种类型。属性的一些常见类型有:整数、标签、列表 标签列表、字符串、字符串列表、输出标签、输出标签列表。非 所有属性都需要在每条规则中指定。因此,属性会构成 从键(名称)到输入型值的可选字典。

许多规则中的 srcs 属性的类型为“标签列表”;其 值(如果存在)是一个标签列表,每个标签都是要 为该规则输入值

在某些情况下,规则种类的名称有点任意, 该规则生成的文件的名称非常有趣 Genrule。如需了解详情,请参阅 一般规则:genrule

在其他情况下,该名称很重要:对于 *_binary*_test 规则, 例如,规则名称决定了 和构建。

这种围绕目标的有向无环图称为“目标图”,或 build 依赖关系图,即 build 依赖关系图所在的网域 Bazel 查询工具运行。

<ph type="x-smartling-placeholder"></ph> 目标 <ph type="x-smartling-placeholder"></ph> build 文件