如何编程查询Bazel build生成的目标输出文件路径
如何编程获取Bazel构建目标的输出文件路径
不要解析bazel build打印的普通日志拿路径,Bazel原生提供了稳定的查询接口,直接返回结构化的路径结果,适合脚本/代码调用:
- 推荐方案:用
bazel cquery直接查询输出文件
执行如下命令即可直接拿到目标对应bazel-out/...格式的输出路径,不需要依赖构建日志的文本匹配:
命令会直接逐行输出目标的所有输出文件路径,和build日志里打印的路径完全一致。如果是在脚本中调用,加上日志过滤参数就能拿到纯路径结果,直接赋值给变量即可:bazel cquery --output=files //foo/bar:registration
这个方案兼容性最好,会自动适配当前的编译配置、动态生成的配置哈希目录(比如示例路径里的# 屏蔽INFO/WARN级别的日志,仅返回路径结果 OUT_FILE=$(bazel cquery --ui_event_filters=-info,-warning --output=files //foo/bar:registration)ST-a82eca4c6b7c),不需要手动处理路径拼接逻辑。 - 避坑提醒:不要手动拼接路径
不要尝试先通过bazel info bazel-bin拿到根目录再手动拼接目标路径,不同编译模式、不同Bazel版本生成的中间目录结构、哈希后缀都是动态变化的,手动拼接的路径很容易失效。 - 自定义规则开发场景
如果你是在编写Starlark自定义规则,需要在规则实现逻辑中获取输出路径,直接读取你通过ctx.actions.declare_file声明的输出文件对象的path字段即可,该字段存储的就是标准的bazel-out/...格式相对路径。
附示例场景对应的执行效果:
执行查询命令后,会直接返回目标路径:bazel-out/k8-fastbuild-ST-a82eca4c6b7c/bin/foo/bar/registration/registration_/registration
内容的提问来源于stack exchange,提问作者Mark Harrison
相关产品推荐
相关产品推荐

