在我skylark (bazel)规则实现中,我有一个从其中提取Label Objects的File objects的分集。
在公共属性中,我发现所有的云雀规则都可能有tags属性,我可以给出一个空闲字符串的列表。
有什么方法可以让我找到原始规则的标签吗?
(我的最终目标是从原始描述集中提取来自带有“X”标签的规则的文件)。
发布于 2017-04-03 16:52:13
规则通过向下游传播信息(到依赖于它们的规则)。提供者是规则可以返回或不返回的信息(结构)。我发现将提供者视为规则可以选择实现的接口是很有用的。例如,可以将返回cc提供程序的Skylark规则视为它实现了C++规则接口,因此我们可以预期它是C++规则和任何恰好读取cc提供程序的规则的有意义的依赖关系。如果规则没有实现java提供程序,那么我们就不能期望它作为java规则的依赖项工作。
规则只能访问其直接依赖项中的信息,并且只能通过提供程序访问。因此,要访问依赖项的tags,依赖项必须向提供程序公开该信息。如果依赖的规则(你想提取其tags )也是Skylark规则,并且你可以修改它们的实现,那么只需返回一个包含它们的tags的自定义提供者,你就完成了。
但是,如果您希望依赖于本地*_test规则(通常使用tags的规则),则需要使用包装器。
基本思想是编写一个Skylark macro来包装这样的规则。您可以编写my_macro(..., tags=...),而不是在构建文件中编写例如cc_test(..., tags=...)。
宏的实现将实例化两个规则:native.cc_test和一个简单的Skylark规则(您必须实现该规则),该规则只有一个tags属性和一个用于测试规则的label属性。宏将tags传递给这两个规则(以及将其余属性传递给cc_test),并且Skylark规则依赖于测试规则,因此它可以访问它的部分文件,并且可以返回一个自定义提供程序,该提供程序在一个结构中包含depset和标记数据。
https://stackoverflow.com/questions/43169201
复制相似问题