You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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目标统一包装:

  1. 在BUILD文件中添加如下配置:
sh_binary(
    name = "target_with_post_action",
    srcs = ["target_with_post_action.sh"],
    data = [
        "//path/to/my:target", # 原有目标作为数据依赖
        "//path/to:your_custom_script", # 你的后续处理脚本
    ],
)
  1. 编写target_with_post_action.sh脚本:
#!/bin/bash
# 先运行原有目标
./path/to/my/target
# 执行后续处理逻辑
./path/to/your_custom_script out
  1. 直接运行新的目标即可自动完成全流程: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的运行目录有固定格式,你可以通过以下命令自行拼接:

  1. 先获取execroot根路径:bazel info execution_root
  2. 完整的运行cwd路径为:<execroot路径>/bazel-out/<构建配置>/bin/<目标相对路径>/<目标名称>.runfiles/<工作区名称>
    该方式适配性较差,不同构建配置(如opt、dbg)路径会有变化,更推荐用方式A获取准确路径。

内容的提问来源于stack exchange,提问作者leosh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 05:51:00