如何从 Bazel 规则查询兄弟规则
How to query sibling rules from a Bazel rule
我希望能够在 Bazel BUILD 文件中执行以下操作:
alpha(
name = "hello world",
color = "blue"
)
beta(
name = "hello again"
)
其中 alpha
和 beta
是自定义规则。我希望 beta
能够访问 alpha
规则的 color
属性, 而无需添加标签属性 。在 Bazel 查询中,我可以这样做:
bazel query 'kind(beta, siblings(kind(alpha, //...)))'
这给了我 beta
,它与 alpha
并排。我可以从 beta
规则的实现函数中以某种方式实现相同的目的吗?
def _beta_rule_impl(ctx):
# This does not exist, I wish it did: ctx.siblings(kind='alpha')
我见过用这样的标签完成的
beta(
name = "hello again",
alpha_link = ":hello world" # explicitly linking
)
但我觉得这有点冗长,尤其是因为有兄弟查询支持。
根据问题的表述方式,答案是否定的。不可能。
Bazel 的设计理念是明确目标依赖关系。 Providers mechanism 是为了在分析阶段提供对依赖图信息的访问。
很难说实际用例是什么。使用 Aspects 可能是答案。
在我的场景中,我试图让 genrule
在继续之前调用 test
规则:
genrule(
name = "generate_buf_image",
srcs = [":protos", "cookie"],
outs = ["buf-image.json"],
cmd = "$(location //third_party/buf:cas_buf_image) //example-grpc/proto/v1:proto_backwards_compatibility_check $(SRCS) >$(OUTS)",
tools = [
"//third_party/buf:cas_buf_image",
"@buf",
],
)
如果cas_buf_image.sh
有ls -l "example-grpc/proto/v1" >&2
,则显示:
… cookie -> …/example-grpc/proto/v1/cookie
… example.proto -> …/example-grpc/proto/v1/example.proto
IOW,检查 example-grpc/proto/v1/cookie
链接到什么并 cd
访问其目录,然后执行 git
命令应该有效。
我希望能够在 Bazel BUILD 文件中执行以下操作:
alpha(
name = "hello world",
color = "blue"
)
beta(
name = "hello again"
)
其中 alpha
和 beta
是自定义规则。我希望 beta
能够访问 alpha
规则的 color
属性, 而无需添加标签属性 。在 Bazel 查询中,我可以这样做:
bazel query 'kind(beta, siblings(kind(alpha, //...)))'
这给了我 beta
,它与 alpha
并排。我可以从 beta
规则的实现函数中以某种方式实现相同的目的吗?
def _beta_rule_impl(ctx):
# This does not exist, I wish it did: ctx.siblings(kind='alpha')
我见过用这样的标签完成的
beta(
name = "hello again",
alpha_link = ":hello world" # explicitly linking
)
但我觉得这有点冗长,尤其是因为有兄弟查询支持。
根据问题的表述方式,答案是否定的。不可能。
Bazel 的设计理念是明确目标依赖关系。 Providers mechanism 是为了在分析阶段提供对依赖图信息的访问。
很难说实际用例是什么。使用 Aspects 可能是答案。
在我的场景中,我试图让 genrule
在继续之前调用 test
规则:
genrule(
name = "generate_buf_image",
srcs = [":protos", "cookie"],
outs = ["buf-image.json"],
cmd = "$(location //third_party/buf:cas_buf_image) //example-grpc/proto/v1:proto_backwards_compatibility_check $(SRCS) >$(OUTS)",
tools = [
"//third_party/buf:cas_buf_image",
"@buf",
],
)
如果cas_buf_image.sh
有ls -l "example-grpc/proto/v1" >&2
,则显示:
… cookie -> …/example-grpc/proto/v1/cookie
… example.proto -> …/example-grpc/proto/v1/example.proto
IOW,检查 example-grpc/proto/v1/cookie
链接到什么并 cd
访问其目录,然后执行 git
命令应该有效。