如何在Bazel规则的.bzl文件中获取WORKSPACE目录?求优化方案
获取Bazel WORKSPACE目录并优化路径打印规则
要在Bazel的.bzl规则中获取WORKSPACE根目录,其实Bazel的规则上下文(ctx)已经提供了现成的属性:ctx.workspace_root,它会直接返回WORKSPACE目录的绝对路径,完全不需要自己额外计算。
接下来针对你给出的示例,我们可以用这个属性来重构代码,让实现更简洁清晰:
优化后的simple_example.bzl
def _impl(ctx): # 直接通过ctx.workspace_root获取WORKSPACE根目录 command = "\n".join([f"echo {ctx.workspace_root}/{f.short_path}" for f in ctx.files.srcs]) ctx.actions.write( output=ctx.outputs.executable, content=command, is_executable=True ) echo_full_path = rule( implementation=_impl, executable=True, attrs={ "srcs": attr.label_list(allow_files=True), } )
更轻量的简洁实现方式
如果你的需求只是打印文件完整路径,其实完全不需要自定义规则——用Bazel内置的genrule就能一步到位,省去编写.bzl文件的成本:
BUILD文件中的简化写法
genrule( name = "echo", srcs = glob(["src/**/*.cc"]), outs = ["echo.sh"], cmd = "\n".join([f"echo $(rootpath {f})" for f in glob(["src/**/*.cc"])]), executable = True, )
这里的$(rootpath)是Bazel内置变量,会直接展开为文件相对于WORKSPACE根目录的绝对路径,完美匹配你的需求。
另外补充:如果是在clang-format、clang-tidy等工具的规则中使用,ctx.workspace_root同样适用,你可以直接用它作为基础路径,配合文件的short_path构造工具需要的完整路径参数,非常方便。
内容的提问来源于stack exchange,提问作者Mike van Dyke
相关产品推荐
相关产品推荐

