Bazel 如何解释标签中的特殊词位,如 `/`、`:`、`//` 和 `@`?

How does Bazel interpret special lexemes like `/`, `:`, `//` and `@` in labels?

在处理外部存储库(具有自己的 WORKSPACE 的目录)时,我无法理解如何构建正确的 label 表单。

/://@ 等字符的语义是什么?

例如:

它们在外部存储库中使用时是否保留其含义?另外,//external 有什么特别之处吗?

/ 是包和目标名称的分隔符。

  • relative/package/to/my:target
  • //absolute/package/to:my/file/target.java

包定义为包含 BUILDBUILD.bazel 文件的目录。

: 是在包中选择规则或文件目标的词素。

  • //my/package:my_java_binary

选择在 <workspace root>/my/package/BUILD

中定义的目标 my_java_binary
  • //my/package:file.go

选择文件 <workspace root>/my/package/file.go 如果 <workspace root>/my/package/BUILD 存在,并且该 BUILD 文件中有引用它的规则。

  • //:my/nested/file.txt

如果 <workspace root>/BUILD 存在,但不在 mymy/nested 子目录中,则选择文件 <workspace root>/my/nested/file.txt

// 是包含 WORKSPACE 文件的当前或最近父目录的位置。

也称为工作区根目录。

@ 用于在 //

左侧按名称引用存储库
  • @io_bazel_rules_scala//scala:scala.bzl:在您的 WORKSPACE 文件中查找名为 io_bazel_rules_scala 的存储库。通常使用 http_archivegit_repository.
  • 定义
  • @//my/package:target: @单独引用当前工作空间。

自 Bazel 0.16.0 起,@ 可用于包名。

Do they preserve their meaning when used in an external repository?

是的,将 @<repository> 语法视为命名空间机制。

Also, is //external special in any way?

是的,用于bind功能,不推荐使用。 bind 允许您在 //external.

中为目标指定一个别名