如何将Bazel中nodejs_binary的输出传递给go_test规则使用
解决方案
该需求完全可以实现,核心是通过genrule绑定node脚本的执行动作和输出产物,再利用Bazel的依赖关系自动控制执行顺序,无需手动调度。
步骤1:修正并补充构建规则
首先修正你原nodejs_binary的拼写错误(js_scirpt改为js_script),然后新增genrule调用node脚本生成目标json文件:
nodejs_binary( name = "js_script", data = [ "@npm//some_lib", ], entry_point = ":some_js_script.js", ) genrule( name = "gen_js_output", # 声明依赖node二进制,Bazel会保证先编译执行完node脚本再运行该genrule tools = [":js_script"], # 声明输出的json文件名,可自定义 outs = ["script_output.json"], # 执行命令:运行node脚本,将输出写入到genrule指定的输出路径,$@为Bazel内置变量,对应outs的路径 # 如果你的node脚本支持指定输出参数,可改为 $(location :js_script) --output $@ cmd = "$(location :js_script) > $@", )
步骤2:配置go_test依赖
将genrule的输出产物加入go_test的data依赖中,Bazel会自动保证gen_js_output执行完成后再启动测试:
go_test( name = "your_go_test", srcs = ["your_test.go"], # 引入生成的json文件作为测试依赖 data = [":gen_js_output"], deps = [ # 你原有依赖保持不变 ], )
步骤3:Go测试中读取文件
Bazel运行测试时的工作目录为工作区根目录,直接按包的相对路径读取即可:
package your_package import ( "encoding/json" "os" "testing" ) func TestYourLogic(t *testing.T) { // 替换为你的包对应的实际相对路径 content, err := os.ReadFile("path/to/your/package/script_output.json") if err != nil { t.Fatalf("读取js输出文件失败: %v", err) } var jsResult map[string]interface{} // 替换为你实际的结构体类型 if err = json.Unmarshal(content, &jsResult); err != nil { t.Fatalf("解析json失败: %v", err) } // 后续测试逻辑 }
可选优化
如果node脚本的输出内容很小,你也可以在genrule中将输出写入到Go的常量定义文件,直接作为代码编译进测试二进制,不需要运行时读文件,适合需要频繁运行测试的场景。你原本的写入磁盘再读取的方案逻辑直观、维护成本低,适配绝大多数场景。
内容的提问来源于stack exchange,提问作者Yar
相关产品推荐
相关产品推荐

