如何引用bazel BUILD文件相对于工作区根目录的所在源目录路径?
解决方案
Bazel 提供了内置的预定义变量可以直接满足需求,无需依赖$(location)语法,不会引入循环依赖。
核心原理
Bazel 解析 BUILD 文件时,会内置两个可直接调用的全局值:
- Starlark 全局变量
PACKAGE_NAME:值为当前 BUILD 文件所在目录相对于工作区根的相对路径,末尾不带斜杠,工作区根目录的PACKAGE_NAME为空字符串 - Make 变量
$(PACKAGE_NAME):作用和上述变量一致,可直接在属性的字符串值中展开使用
使用示例
如果你需要传入的是当前BUILD文件所在目录的相对路径,直接修改配置如下:
sh_binary( … args = [ "$(PACKAGE_NAME)", ], … )
如果你需要传入的是当前BUILD文件本身的完整相对路径,可以用Starlark语法拼接避免根目录路径出现前导斜杠问题:
# BUILD文件内容 sh_binary( … args = [ "BUILD" if PACKAGE_NAME == "" else "{}/BUILD".format(PACKAGE_NAME), ], … )
说明
该值是Bazel解析BUILD文件阶段就确定的静态值,不会引入任何额外依赖,BUILD文件移动后会自动更新为对应路径,无需手动修改配置。
内容的提问来源于stack exchange,提问作者Noel Yap
相关产品推荐
相关产品推荐

