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

Допустим, у меня есть простая java-программа, включающая 2 класса:

Example, Example2

и другой класс, который использует оба класса:

ExamplesUsage

и у меня есть соответствующие цели сборки bazel типа java_library: example, example2, examples_usage

поэтому example и example2 должны быть скомпилированы до того, как будет построен examples_usage.

Я хочу собрать информацию со всех трех целей, используя технику распространения аспектов базеля, как мне это сделать?


person Natan    schedule 24.06.2017    source источник


Ответы (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, чтобы сохранить собранные данные.

person Natan    schedule 24.06.2017