获取给定bazel目标的特定属性的值

获取给定bazel目标的特定属性的值,bazel,Bazel,我相信这是有据可查的,但在任何地方都找不到答案 如果我有: ```bazel_rule( name = "foo", srcs = ["foo.cpp"], attr_bar = "bar" )``` 如果在Starlark(.bzl)文件中引用了此规则(//src:foo),如何查询目标以获取特定属性的值。e、 g.get\u属性(“//src:foo”,“attr\u bar”)在本例中应返回“bar”。这取决于您是尝试从a、a还是a读取属性 简短答覆: 宏无法读取

我相信这是有据可查的,但在任何地方都找不到答案

如果我有:

```bazel_rule(
    name = "foo",
    srcs = ["foo.cpp"],
    attr_bar = "bar"
)```

如果在Starlark(.bzl)文件中引用了此规则(
//src:foo
),如何查询目标以获取特定属性的值。e、 g.
get\u属性(“//src:foo”,“attr\u bar”)
在本例中应返回“bar”。

这取决于您是尝试从a、a还是a读取属性

简短答覆:

宏无法读取目标的属性(大体上,宏是在构建文件加载时计算的,属性稍后在分析时计算的)。您可以在宏中执行一些操作,例如接收您关心的属性并创建规则(在您的示例中为
bazel_rule
),以便宏具有属性值,但这通常会很快变得混乱且难以遵循

Starlark规则也不能直接从依赖项读取属性值(当然,它可以读取自己的属性)。您感兴趣的规则(
bazel_规则
here)必须将信息放在a中,Starlark规则从其依赖项读取提供者


方面可以通过
ctx.rule.attr直接读取其所评估的规则的属性。是的。

谢谢!上下文:我正在用bazel构建ROS包,它的构建系统有一个packageFoo声明依赖项的概念,它本身并不需要,但是任何依赖于Foo的包都需要依赖它。所以我想创建一个带有参数“deps2”的宏,这样当a依赖于B时,a将B的“deps2”放在自己的“deps”属性中。我松散地使用了单词attribute,我真正需要的只是让A读取B的“deps2”参数。我也尝试过使用一个规则,但我需要将一个规则包装到另一个规则中,并在包装器更新ctx.attrs.deps中,这是冻结的。这听起来类似于
java_库
exports
属性:您使用的是您自己的starlark规则、本机规则还是其他人的规则?如果您使用的是您自己的规则,让我们称之为
rosu包
,我的做法是向
rosu包
添加一个名为
exports
(或任何您想要的)的属性,在
rosu包
的实现中,阅读
exports
,并将其放入一个提供者,比如
RosInfo
。另外,在impl for
ros_包中
您从依赖项中阅读了
RosInfo
提供程序,从提供程序中读取
导出
,并将其添加到规则中的deps中。非常感谢您周到的回复。我正在使用规则,已经在该存储库下提交了FR。