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

如何在Bazel BUILD文件中为mocha_test传递genrule生成目录的绝对路径?

解决Bazel中mocha_test传递genrule生成目录绝对路径的问题

首先修正genrule的目录输出定义,Bazel要求目录类型的输出必须在outs中添加斜杠,否则会被当作文件处理,导致路径错误:

genrule(
    name = "app_dir_rule",
    srcs = [],
    outs = ["app_dir/"],  # 加斜杠标记为目录输出
    cmd = """
        mkdir -p $@

        $(location :app_binary) process_dependencies --output=$@/vendor
        cp $(location :app_binary) $@
    """,
    tools = [":app_binary"],
    visibility = ["//visibility:private"],
)

接下来,在mocha_test的env字段中,直接用$(location)只能得到相对路径,要获取绝对路径,需要结合Bazel测试环境的内置变量TEST_SRCDIR和TEST_WORKSPACE,配合$(execpath)来拼接:

mocha_test(
    name = "mocha",
    args = ["--inspect"],
    chdir = package_name(),
    data = [
        ":.mocharc.js",
        ":.prettierignore",
        # ... 其他依赖
        ":app_dir_rule"
    ],
    env = {
        # 拼接出绝对路径:TEST_SRCDIR是Bazel测试资源根目录,TEST_WORKSPACE是当前工作区名称
        "APP_DIR": "$(TEST_SRCDIR)/$(TEST_WORKSPACE)/$(execpath :app_dir_rule)"
    },
    tags = ["local"],
)

原理说明

  • $(execpath :app_dir_rule):返回目标相对于Bazel工作区根的路径
  • TEST_SRCDIR:Bazel在测试运行时自动设置的环境变量,指向包含所有测试依赖的根目录
  • TEST_WORKSPACE:自动设置的当前工作区名称,用于定位工作区在TEST_SRCDIR下的镜像目录

两者拼接后就能得到genrule生成目录的绝对路径,确保测试代码能正确访问该目录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 06:22:10