假设我有一个简单的 java 程序,包括 2 个类:
Example
,Example2
和另一个使用这两个类的类:
ExamplesUsage
example
我有相应的 java_library: , example2
,的 bazel 构建目标
examples_usage
所以需要在构建examples_usage之前编译example
。example2
我想使用 bazel 方面传播技术从所有三个目标中积累信息,我该怎么做呢?
假设我有一个简单的 java 程序,包括 2 个类:
Example
,Example2
和另一个使用这两个类的类:
ExamplesUsage
example
我有相应的 java_library: , example2
,的 bazel 构建目标
examples_usage
所以需要在构建examples_usage之前编译example
。example2
我想使用 bazel 方面传播技术从所有三个目标中积累信息,我该怎么做呢?
这是一个在此构建链中累积源文件数量的示例:
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
需要调用的信息,以保存收集到的数据