首页 > 解决方案 > Bazel 如何解释标签中的 `/`、`:`、`//` 和 `@` 等特殊词位?

问题描述

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

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

例如:

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

标签: bazel

解决方案


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

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

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

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

  • //my/package:my_java_binary

选择my_java_binary定义的目标<workspace root>/my/package/BUILD

  • //my/package:file.go

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

  • //:my/nested/file.txt

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

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

否则称为工作空间根。

@用于在左侧使用时通过其名称引用存储库//

  • @io_bazel_rules_scala//scala:scala.bzl:在您的 WORKSPACE 文件中查找名为io_bazel_rules_scala. 通常使用http_archiveor定义git_repository
  • @//my/package:target:@单独指当前工作区。

从 Bazel 0.16.0 开始,@可以在包名称中使用。

它们在外部存储库中使用时是否保留其含义?

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

另外, //external 有什么特别之处吗?

是的,它用于bind功能,不再推荐。bind让你给目标一个别名//external


推荐阅读