1

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

Example,Example2

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

ExamplesUsage

example我有相应的 java_library: , example2,的 bazel 构建目标 examples_usage

所以需要在构建examples_usage之前编译exampleexample2

我想使用 bazel 方面传播技术从所有三个目标中积累信息,我该怎么做呢?

4

1 回答 1

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需要调用的信息,以保存收集到的数据

于 2017-06-24T17:40:46.607 回答