在我的skylark(bazel)规则实现中,我有一个File objects的depset,我从中提取了Label Objects的depset。
在常见属性中,我发现所有的云雀规则都可能有tags属性,我可以在其中给出一个自由字符串列表。
我有什么方法可以达到原规则的标签吗?
(我的最终目标是从原始depset中提取源自带有标记“X”的规则的文件。)
答案 0 :(得分:2)
规则通过 Providers 向下游传播信息(根据规则传播到规则)。提供者是规则可以返回或不返回的信息(结构)。我发现将Providers视为规则可以选择实现的接口很有用。例如,返回cc
提供程序的Skylark规则可以被视为实现了C ++规则接口,因此我们可以预期它将成为C ++规则和任何恰好读取的规则的有意义的依赖关系{{1提供者。如果规则没有实现cc
提供程序,那么我们就不能指望它作为java规则的依赖项工作。
规则只能访问其直接依赖关系中的信息,并且只能通过提供者访问。因此,要访问依赖项的java
,依赖项必须使用该信息公开提供程序。 AFAIK那里没有规则可以公开的提供者,但是如果依赖规则(你想要提取的tags
)也是Skylark规则并且你可以修改它们的实现,那么只需返回一个自定义提供者他们的tags
已经完成了。
但是,如果您希望依赖本机tags
规则(通常使用*_test
的规则),则需要使用包装器。
基本思想是写一个Skylark macro来包装这些规则。而不是写例如在BUILD文件中tags
,您需要撰写cc_test(..., tags=...)
。
宏的实现将实例化两个规则:my_macro(..., tags=...)
和一个简单的Skylark规则(你必须实现),它只有native.cc_test
属性和一个标签属性测试规则。宏将tags
传递给两个规则(以及其余属性到tags
),并且Skylark规则依赖于测试规则,因此它可以访问其文件的depset,并且可以返回自定义提供程序,在一个结构中包含depset和标记数据。