如何使用bazel方面向下传播数据构建链

如何使用bazel方面向下传播数据构建链,bazel,bazel-aspect,Bazel,Bazel Aspect,假设我有一个简单的java程序,包括两个类: 示例,示例2 以及另一个使用这两个类的类: examplesage 我有相应的bazel java_库类构建目标: example,example2,examples\u用法 因此,在构建示例使用之前,需要编译example和example2 我想使用bazel aspects传播技术从所有三个目标累积信息,我该如何做?下面是一个累积此构建链中源文件数量的示例: def _counter_aspect_impl(target, ctx): sou

假设我有一个简单的java程序,包括两个类:

示例
示例2

以及另一个使用这两个类的类:

examplesage

我有相应的bazel java_库类构建目标:
example
example2
examples\u用法

因此,在构建示例使用之前,需要编译
example
example2


我想使用bazel aspects传播技术从所有三个目标累积信息,我该如何做?

下面是一个累积此构建链中源文件数量的示例:

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\u action
来保存收集的数据