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

时间:2017-06-24 17:33:16

标签: bazel bazel-aspect

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

ExampleExample2

和另一个使用这两个类的类:

ExamplesUsage

我有类似java_library的相应bazel构建目标: exampleexample2examples_usage

因此需要在构建examples_usage之前编译exampleexample2

我想使用bazel方面的传播技术积累来自所有三个目标的信息,我该如何去做呢?

1 个答案:

答案 0 :(得分: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.actionctx.file_action来保存收集的数据