【问题标题】:Feed Bazel output to another Bazel rule将 Bazel 输出馈送到另一个 Bazel 规则
【发布时间】:2021-12-02 02:37:29
【问题描述】:

我对 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 规则。对这如何可能有任何想法(或者可能有更好的方法)?

【问题讨论】:

    标签: bazel bazel-rules


    【解决方案1】:

    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 来查找文件的路径。

    此外,Node 代码应该为目的地使用一个命令行标志来写入其输出。如果它不能这样做,则使用 shell 命令将输出移动到$(location something.json)

    【讨论】:

    • 谢谢你,Brian - genrule 也是我的第一次尝试。它的问题是由于某种原因它没有找到 nodejs 依赖项。例如我会在你的例子中得到Error: Cannot find module "@npm//some_lib"
    • 您的nodejs_binary 似乎有问题。不幸的是,我不熟悉 nodejs 规则。尝试让bazel run //:js_script 工作,然后再尝试将输出输入到另一个规则中,如果您需要帮助,请询问关于该部分的另一个问题。
    【解决方案2】:

    我不太了解nodejs_binarygo_test,但您可能想要的是通过data 属性依赖nodejs 二进制文件的测试:
    https://github.com/bazelbuild/rules_go/blob/master/go/core.rst#go-test
    @987654322 @

    go_test(
        name = "go_default_test",
        srcs = ["some_test.go"],
        data = [":js_script"],
    )
    

    js_scirpt 会在 go 测试构建之前被构建,并且会在测试执行时提供给测试。

    https://github.com/bazelbuild/rules_go#how-do-i-access-testdata

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-15
      • 2023-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多