Bazel 在Skylark中-给定标签-如何读取原始规则的标签

Bazel 在Skylark中-给定标签-如何读取原始规则的标签,bazel,Bazel,在我的skylark(bazel)规则实现中,我有一个depset of,从中提取一个depset of 在公共属性中,我发现所有skylark规则都可能有一个属性,在这个属性中我可以给出一个自由字符串列表 我有没有办法拿到原始规则的标签 (我的最终目标是从原始depset中提取源于带有标记“X”的规则的文件。)规则通过向下游传播信息(根据它们向规则传播)。提供者是规则可以返回或不返回的信息(结构)。我发现将提供者视为规则可以选择实现的接口很有用。例如,返回 CX提供者的SkyLyk规则可以看作

在我的skylark(bazel)规则实现中,我有一个depset of,从中提取一个depset of

在公共属性中,我发现所有skylark规则都可能有一个属性,在这个属性中我可以给出一个自由字符串列表

我有没有办法拿到原始规则的标签


(我的最终目标是从原始depset中提取源于带有标记“X”的规则的文件。)

规则通过向下游传播信息(根据它们向规则传播)。提供者是规则可以返回或不返回的信息(结构)。我发现将提供者视为规则可以选择实现的接口很有用。例如,返回 CX提供者的SkyLyk规则可以看作是它实现了C++规则接口,因此我们可以期望它是C++规则和发生在读取代码> cc提供者的任何规则的有意义的依赖关系。但是,如果规则没有实现
java
提供程序,那么我们就不能期望它作为java规则的依赖项工作

规则只能访问其直接依赖项中的信息,并且只能通过提供程序访问。因此,要访问依赖项的
标记
,依赖项必须向提供者公开该信息。当然,没有规则可以公开的提供者,但是如果从属规则(您要提取其
标记
)也是Skylark规则,并且您可以修改它们的实现,那么只需返回一个带有
标记
的自定义提供者,就可以了

但是,如果您希望依赖本机
*\u test
规则(通常使用
标记的规则),则需要使用包装器

基本思想是编写一个包来封装这些规则。您可以编写
myu宏(…,tags=…)
而不是在构建文件中编写例如
cc\u测试(…,tags=…)


宏的实现将实例化两个规则:
native.cc_test
和一个简单的Skylark规则(您必须实现),该规则只有一个
tags
属性和一个用于测试规则的标签属性。宏将
标记
传递给这两个规则(加上
cc_test
的其余属性),云雀规则依赖于测试规则,因此它可以访问其文件的数据集,并可以在一个结构中返回带有数据集和标记数据的自定义提供程序。

规则将信息传播到下游(根据规则而定)via.Providers是信息片段(结构)一个规则可以返回或不返回。我认为将提供者看作是一个规则可以选择实现的接口。例如,返回一个 Cc>代码>的SyLyk规则可以被看作是它实现了C++规则接口,所以我们可以期望它是C++规则和发生在读取Co的任何规则的有意义的依赖。de>cc
providers。如果规则没有实现
java
提供程序,那么我们不能期望它作为java规则的依赖项工作

规则只能通过提供程序访问其直接依赖项中的信息。因此,要访问依赖项的
标记
,依赖项必须向提供程序公开该信息。当然,规则不能公开此类提供程序,但是如果要提取依赖规则(其
标记
)也是Skylark规则,您可以修改它们的实现,然后只需返回一个带有
标记的自定义提供程序,就完成了

但是,如果您希望依赖本机
*\u test
规则(通常使用
标记的规则),则需要使用包装器

基本思想是编写一个包来包装这些规则。您可以编写
myu宏(…,tags=…)
,而不是在构建文件中编写例如
cc\u测试(…,tags=…)


宏的实现将实例化两个规则:
native.cc_test
和一个简单的Skylark规则(您必须实现),该规则只有一个
tags
属性和测试规则的一个label属性。宏将
tags
传递给这两个规则(加上
cc\u测试的其余属性),Skylark规则依赖于测试规则,因此它可以访问其文件的depset,并且可以在一个结构中返回一个自定义提供程序,其中包含depset和标记数据。

谢谢!!这意味着如果我依赖于本机规则(如java\u库)我无法修改它的提供程序,也无法访问它的标记。关于获取间接依赖项的信息:它在任何地方都没有真正的文档记录,但我看到rules_scala选择添加另一个字段“extra_information”:它从所有直接依赖项收集额外的\u信息字段。您知道提供的任何其他规则是否以这种方式运行吗?>如果我依赖本机规则(如java\u库)我无法修改它的提供程序,也无法访问它的标记。正确。它从所有直接依赖项收集额外的_信息字段。您知道其他提供的规则是否有这种行为吗?--不,我认为任何本机规则都没有这种自由形式的可扩展字段。许多本机规则提供有关其整个传输的信息当然,C++的规则字段是关闭的。关键思想是,规则可以决定它自己的DEP提供的信息是什么,而不是父向对象向下发送。谢谢!!这意味着如果我依赖于本地规则(比如JavaScript库)我无法修改它的提供程序,也无法访问它的标记。关于获取间接依赖项的信息:它在任何地方都没有真正的文档记录,但我看到rules_scala选择添加另一个字段“extra_information”:它从所有直接依赖项收集额外的_信息字段。您知道提供的任何其他规则是否有此行为吗