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)

这具有以下优点:

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

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...