Как распространять данные по цепочке сборки, используя базовые аспекты

Допустим, у меня есть простая 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 необходимо вызвать, чтобы сохранить собранные данные

Другие вопросы по тегам