Bazel:地图设置(文件)->设置(目标)

时间:2020-08-12 02:28:20

标签: 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

我觉得此功能必须已经存在,但是我找不到它。

1 个答案:

答案 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)

这具有以下优点:

  1. 您不需要首先弄清楚文件的标签(因为查询中的attr对标签起作用)。
  2. aquery在分析阶段之后进行查询,因此您的结果更加准确,因为它考虑了配置(标志等)。
  3. 这将适用于任何属性,因为它查询的是所有操作的输入,其级别比规则低

另一方面,由于aquery运行加载和分析,因此可能要比query花费更长的时间,因为query仅运行加载阶段。