0

我们在 Bazel 中看到了相同目标的重复构建,并想知道是什么导致了这种情况。

这是一个示例输出:

[52,715 / 55,135] 12 action running
    Bazel package: some-pkg - Target: a_target - Generating files at bazel-out/host/bin/some-pkg/a_target_generate [for host]; 264s remote-cache, processwrapper-sandbox
    Bazel package: some-pkg - Target: a_target - Generating files at bazel-out/k8-fastbuild/bin/some-pkg/a_target_generate; 264s remote-cache, processwrapper-sandbox
    ...

我们无法确定问题所在。看起来这只发生在 Linux 上而不是 Mac 上。

目标a_targetcustom_rule目标。它应该独立于平台。

custom_rule = rule(
    attrs = dict(
       ...
        _custom_rule_java_binary = attr.label(
            cfg = "host",
            default = Label("//tools/bazel/build/rules/custom-rule:custom_rule_bin"),
            executable = True,
        ),
        _singlejar = attr.label(
            cfg = "host",
            default = Label("@bazel_tools//tools/jdk:singlejar"),
            executable = True,
            allow_files = True,
        ),
    ),
    implementation = ...,
)

custom_rule_bin定义如下:

java_library(
    name = "custom_rule",
    srcs = glob(["src/main/java/**/*.java"]),
    deps = [
        ...,
    ],
)

java_binary(
    name = "custom_rule_bin",
    visibility = ["//visibility:public"],
    main_class = "...",
    runtime_deps = [
        "@org_slf4j_simple",
        ":custom_rule",
        "//some-pkg:some_pkg", # same some-pkg where a_target is built twice
    ],
)

不同之处在于一个说“ for host ”而另一个没有。任何人都知道额外的“ for host ”构建是什么?

我确实感觉它与cfg自定义规则上的属性有某种关系。这可能来自一些示例代码。我们在所有生成代码的规则上使用相同的值。这个自定义规则很特别,因为它需要来自 Bazel 正在构建的应用程序的代码来运行和生成额外的代码。

任何见解都会理解为什么host会出错以及正确的值是什么。

任何想法/提示如何调试这个?

4

0 回答 0