我们在 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_target
是custom_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
会出错以及正确的值是什么。
任何想法/提示如何调试这个?