如何在bazel run执行结束后运行后置脚本或获取目标运行cwd
Bazel run 执行后触发自定义操作/获取运行目录解决方案
方法1:直接实现bazel run执行完成后运行指定脚本
最简单的实现方式是借助--run_under参数实现流程包装,不需要修改原有BUILD配置:
- 首先编写自定义包装脚本
post_run_wrapper.sh,示例内容如下:
#!/bin/bash # 先执行原bazel目标,所有参数透传给目标 "$@" # 可添加判断:仅原目标执行成功时才运行后续脚本 if [ $? -eq 0 ]; then # 当前工作目录就是目标运行时的cwd,可直接访问生成的out文件 # 此处替换为你自己的脚本路径和逻辑 /path/to/your/custom_script.sh "$PWD/out" fi
- 给脚本添加执行权限:
chmod +x post_run_wrapper.sh - 执行bazel run时指定该包装脚本即可:
bazel run --run_under=$(pwd)/post_run_wrapper.sh //path/to/my:target
如果你希望把逻辑固化到构建配置里,可以新增一个sh_binary目标统一包装:
- 在BUILD文件中添加如下配置:
sh_binary( name = "target_with_post_action", srcs = ["target_with_post_action.sh"], data = [ "//path/to/my:target", # 原有目标作为数据依赖 "//path/to:your_custom_script", # 你的后续处理脚本 ], )
- 编写
target_with_post_action.sh脚本:
#!/bin/bash # 先运行原有目标 ./path/to/my/target # 执行后续处理逻辑 ./path/to/your_custom_script out
- 直接运行新的目标即可自动完成全流程:
bazel run //:target_with_post_action
方法2:单独获取bazel run目标的运行cwd
如果你不需要自动触发后续脚本,只需要拿到目标运行时的工作目录,可以用以下两种方式:
方式A:通过包装脚本打印cwd(无需修改原有目标代码)
- 编写
print_cwd.sh脚本:
#!/bin/bash echo "TARGET_RUN_CWD: $PWD" # 透传参数执行原有目标 exec "$@"
- 添加执行权限后运行:
bazel run --run_under=$(pwd)/print_cwd.sh //path/to/my:target | grep TARGET_RUN_CWD | awk '{print $2}'
命令输出的内容就是目标运行的cwd路径,后续你可以直接用该路径访问out文件。
方式B:通过bazel info拼接路径
bazel的运行目录有固定格式,你可以通过以下命令自行拼接:
- 先获取execroot根路径:
bazel info execution_root - 完整的运行cwd路径为:
<execroot路径>/bazel-out/<构建配置>/bin/<目标相对路径>/<目标名称>.runfiles/<工作区名称>
该方式适配性较差,不同构建配置(如opt、dbg)路径会有变化,更推荐用方式A获取准确路径。
内容的提问来源于stack exchange,提问作者leosh
相关产品推荐
相关产品推荐

