如何解决Bazel:地图设置文件->设置目标
根据https://docs.bazel.build/versions/master/query-how-to.html#What_build_rule_contains_file_ja,
fullname=$(bazel query path/to/file/bar.java)
bazel query "attr('srcs',$fullname,${fullname//:*/}:*)"
会告诉我目标bar.java
属于哪个
如何获取多个文件所属的目标集?即映射设置(文件)->设置(目标)。我可以串行执行此操作,但是每次bazel调用都相当昂贵且缓慢-我想一次调用即可完成。
上下文:我想这样做(构建与几个文件有关的目标):
git diff HEAD~ | xargs bazel query "get targets for set(files)" | xargs bazel build
我觉得此功能必须已经存在,但是我找不到它。
解决方法
可以使用query
,但是您也可以使用aquery
作为更直接的方法。
https://docs.bazel.build/versions/master/aquery.html
BUILD
:
genrule(
name = "gen1",srcs = ["a"],outs = ["gen1.out"],cmd = "echo foo > $@",)
pkg/BUILD
:
genrule(
name = "gen2",srcs = ["b"],outs = ["gen2.out"],)
$ bazel aquery "inputs('a|pkg/b',...)" --include_artifacts=false --include_commandline=false
INFO: Analyzed 2 targets (6 packages loaded,10 targets configured).
INFO: Found 2 targets...
action 'Executing genrule //pkg:gen2'
Mnemonic: Genrule
Target: //pkg:gen2
Configuration: k8-fastbuild
ActionKey: 8d7d05620bfd8303aa66488e0cd6586d8e978197126cdb41c5fc8c49c81988ef
action 'Executing genrule //:gen1'
Mnemonic: Genrule
Target: //:gen1
Configuration: k8-fastbuild
ActionKey: d4c76a6b6913ce5d887829dbc00d101c1cf5b0ff5240ed13ea328c26e4b41960
INFO: Elapsed time: 0.198s
INFO: 0 processes.
INFO: Build completed successfully,0 total actions
inputs
(如attr
)接受正则表达式,因此您可以将文件与|
“或”在一起。然后仅过滤Target:
,或使用其他输出之一(--output=(proto|textproto|jsonproto)
)
这具有以下优点:
- 您不需要首先弄清楚文件的标签(因为查询中的
attr
对标签起作用)。 -
aquery
在分析阶段之后进行查询,因此您的结果更加准确,因为它考虑了配置(标志等)。 - 这将适用于任何属性,因为它查询的是所有操作的输入,其级别比规则低
另一方面,由于aquery
运行加载和分析,因此可能要比query
花费更长的时间,因为query
仅运行加载阶段。