如何在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
相关产品推荐
相关产品推荐

