根据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
我觉得此功能必须已经存在,但是我找不到它。
答案 0 :(得分:1)
可以使用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"],
cmd = "echo foo > $@",
)
$ 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
仅运行加载阶段。