Правила распространяют информацию вниз по течению (к зависящим от них правилам) через провайдеров. Провайдеры — это фрагменты информации (структуры), которые правило может либо возвращать, либо нет. Я считаю полезным рассматривать провайдеров как интерфейсы, которые правило может выбрать для реализации. Например, правило Skylark, которое возвращает поставщика cc
, можно рассматривать так, как если бы оно реализовало интерфейс правила C++, поэтому мы можем ожидать, что оно будет значимой зависимостью от правил C++ и любого правила, которое считывает поставщики cc
. Однако, если правило не реализует поставщика java
, мы не можем ожидать, что оно будет работать как зависимость правила Java.
Правило может получить доступ к информации только в своих прямых зависимостях и только через Providers. Следовательно, чтобы получить доступ к tags
зависимости, зависимость должна предоставить поставщику эту информацию. Насколько я знаю, нет такого провайдера, который мог бы раскрыть правило, но если зависимые правила (чьи tags
вы хотите извлечь) также являются правилами Skylark, и вы можете изменить их реализацию, то просто верните пользовательский провайдер с их tags
в нем, и вы сделано.
Однако, если вы хотите, например, зависеть от собственных правил *_test
(те, которые обычно используют tags
), вам необходимо использовать оболочку.
Основная идея состоит в том, чтобы написать макрос Skylark для переноса таких правил. Вместо того, чтобы писать, например. cc_test(..., tags=...)
в файле BUILD вы должны написать my_macro(..., tags=...)
.
Реализация макроса создаст два правила: native.cc_test
и простое правило Skylark (которое вам нужно реализовать), которое имеет только атрибут tags
и один атрибут метки для тестового правила. Макрос передает tags
обоим правилам (плюс остальные атрибуты cc_test
), а правило Skylark зависит от тестового правила, поэтому оно имеет доступ к своему набору файлов и может возвращать пользовательский поставщик с набором зависимостей и помечает данные внутри одной структуры.
person
László
schedule
03.04.2017