bazel - 将 Bazel 输出馈送到另一个 Bazel 规则

标签 bazel bazel-rules

我对 Bazel 还很陌生,很难找到解决方案:

假设我有这个 nodejs_binary 规则:

nodejs_binary(
    name = "js_scirpt",
    data = [
        "@npm//some_lib",
    ],
    entry_point = ":some_js_script.js",
)

现在我需要将 :js_script 的输出馈送到执行其他操作的 go_test 规则。顺序很重要:nodejs 规则应该首先完成,然后 go_test 使用输出。

我认为这应该可以通过将 json 文件从 nodejs_binary 写入磁盘并从 some_js_script.js 读取来实现,不过我无法控制执行顺序,也不知道如何将其传递给 go_test 规则。知道这是如何实现的吗(或者也许有更好的方法)?

最佳答案

一个dependency是 Bazel 让一件事先于另一件事发生的方法。 genrule是运行命令并获得可用输出的最简单方法。

将它们放在一起看起来像这样:

genrule(
    name = "run_js_script",
    tools = [
        ":js_script",
    ],
    outs = [
        "something.json",
    ],
    cmd = "$(location :js_script) --output $(location something.json)",
)

go_test(
    data = [
        ":something.json",
    ],
    [name, srcs, deps, etc]
)

Go 代码应使用 runfiles.go找到文件的路径。

此外,节点代码应该采用命令行标志,以便目标写入其输出。如果无法做到这一点,请使用 shell 命令将输出移动到 $(location Something.json)

关于bazel - 将 Bazel 输出馈送到另一个 Bazel 规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70193581/

相关文章:

java - 从 Bazel 中调用 Checkstyle 的最佳方式是什么?

c++ - 使用Bazel构建时如何设置C++标准版本?

c - Bazel:使用宏从列表生成构建规则

go - Bazel/Golang:规则'go_embed_data'不包含声明的提供程序'GoArchive'

Bazel C++ 规则(cc_liibrary) : why can a target access headers of its dependency that are not exposed via hdrs?

bazel - 我如何告诉 Bazel Python.h 住在哪里?

c++ - bazel可以构建dll吗?

node.js - Bazel 与 lerna 和 yarn 工作区一起使用

c++ - 巴泽尔 |如何将资源复制到构建目录?