Bazel中sh_test运行时无法找到node命令问题求助
问题根因
Bazel 执行 sh_test 时默认会严格过滤环境变量,不会继承本地 shell 的 PATH 配置,哪怕你添加了 local = True 参数,也不会默认导入用户本地的环境变量,因此测试运行时找不到本地安装的 node 可执行文件。而 bazel run 执行 sh_binary 时默认会继承当前 shell 的环境变量,所以可以正常识别 node 命令。
解决方案
- 方法1:执行测试时显式传递本地 PATH 变量
运行测试时追加--test_env参数导入本地 PATH:
要避免每次执行都加参数,可以把配置写入项目根目录的bazel test //:sh_bin --test_env=PATH.bazelrc文件:test --test_env=PATH - 方法2:在 BUILD 配置中指定 PATH 或 node 全路径
明确 node 安装路径的前提下,可以直接在sh_test中配置环境变量,把 node 所在目录加入 PATH:
也可以直接修改sh_test( name = "sh_bin", srcs = [":script.sh"], env = { # 替换为你本地node实际所在的目录列表 "PATH": "/usr/local/bin:/usr/bin:/bin:/your/node/path" }, )script.sh中的node命令为全路径,比如/usr/local/bin/node -v。 - 方法3:使用 rules_nodejs 托管 Node.js 依赖
要彻底解决本地环境差异问题,推荐使用官方的 Node.js Bazel 规则集rules_nodejs,把 Node.js 纳入 Bazel 的依赖管理体系,不需要依赖本地安装的 Node.js 即可正常执行所有构建、测试任务。
内容的提问来源于stack exchange,提问作者Yar
相关产品推荐
相关产品推荐

