Как распространять данные по цепочке сборки, используя базовые аспекты
Допустим, у меня есть простая Java-программа, включающая 2 класса:
Example
, Example2
и другой класс, который использует оба класса:
ExamplesUsage
и у меня есть соответствующие цели сборки Bazel вида java_library:example
, example2
, examples_usage
так example
а также example2
должны быть скомпилированы перед сборкой examples_usage.
Я хочу накапливать информацию по всем трем целям, используя технику распространения базовых аспектов, как мне это сделать?
1 ответ
Вот пример для накопления количества исходных файлов в этой цепочке сборки:
def _counter_aspect_impl(target, ctx):
sources_count = len(ctx.rule.attr.srcs)
print("%s: own amount - %s" % (target.label.name , sources_count))
for dep in ctx.rule.attr.deps:
sources_count = sources_count + dep.count
print("%s: including deps: %s" % (target.label.name , sources_count))
return struct(count = sources_count)
counter_aspect = aspect(implementation = _counter_aspect_impl,
attr_aspects = ["deps"]
)
если мы запустим его в гипотетической Java-программе, мы получим следующий вывод:
example2: own amount - 1.
example2: including deps: 1.
example: own amount - 1.
example: including deps: 1.
examples_usage: own amount - 1.
examples_usage: including deps: 3.
Как вы можете видеть, аспекты "целей" зависимостей запускались первыми, и только потом запускался аспект "зависимых целей".
Конечно, для того, чтобы на самом деле использовать информацию некоторые ctx.action
или же ctx.file_action
необходимо вызвать, чтобы сохранить собранные данные