如何让Bazel可控使用RUNFILES_DIR或RUNFILES_MANIFEST_FILE并测试脚本
如何在Bazel中可控测试RUNFILES_DIR与RUNFILES_MANIFEST_FILE两种模式
问题背景
在Linux环境下,Bazel运行目标时通常会设置RUNFILES_DIR环境变量,但部分场景下会改用RUNFILES_MANIFEST_FILE。编写兼容两种模式的脚本后,需要手动触发这两种场景验证兼容性,但直接使用--noenable_runfiles参数会导致py_binary找不到可执行文件(亲测Bazel 8.3.0/8.4.0的Linux环境下会出现这个问题)。
触发两种模式的具体方法
1. 触发RUNFILES_DIR模式(默认情况)
直接正常运行目标即可,这是Linux上Bazel的默认行为:
bazel run //:print_env
此时进程环境中会包含RUNFILES_DIR变量,指向目标的运行文件目录。
2. 触发RUNFILES_MANIFEST_FILE模式
要强制使用清单文件模式,需要结合--enable_runfiles=no和--run_under参数,避免py_binary找不到可执行文件的问题:
bazel run --enable_runfiles=no --run_under="bash -c" //:print_env
或者更灵活的手动方式:
- 先构建目标:
bazel build //:print_env
- 找到生成的清单文件(一般位于
bazel-bin/print_env.runfiles_manifest路径),手动设置环境变量后运行:
export RUNFILES_MANIFEST_FILE=$(bazel info bazel-bin)/print_env.runfiles_manifest unset RUNFILES_DIR bazel-bin/print_env
关键细节
--enable_runfiles=no会让Bazel生成清单文件而非实际的运行文件目录,但py_binary的Python启动器依赖运行文件目录结构,因此需要通过--run_under或手动指定清单文件绕开这个问题。- 手动清空
RUNFILES_DIR并设置RUNFILES_MANIFEST_FILE,能精准模拟纯清单文件的运行环境,方便测试脚本中的兼容逻辑。
内容的提问来源于stack exchange,提问作者qznc
相关产品推荐
相关产品推荐

