如何构建所有使用特定规则的目标?(涉及Bazel命令`bazel build`)

4
我们开始使用 gRPC 并目前使用 bazel 作为构建工具。当工程师更新 proto 定义后,他们需要进行 proto 编译。由于我们代码库的结构,proto 编译目标将分散在代码库中。
我所能想到的唯一选择是使用目标命名约定,这样工程师只需执行类似于 bazel build //...:compile-proto 的操作。是否还有其他方法可以方便地编译所有已更新的 proto 定义?
2个回答

5
如果你给每个项目添加一个特定的标签,你就可以使用--build_tag_filters
例如:
a_proto_library(
  name = "compile-proto",
  tags = ["a_proto"],
  [...]
)

然后执行 bazel build --build_tag_filters=a_proto //... 命令。

你也可以将该规则包装在 中,以自动添加标签。


2

我认为//...:compile-proto不是一个有效的目标模式,所以很遗憾我不能确定它是否可行(你也不一定真的想依赖命名约定)。请参见https://docs.bazel.build/versions/main/guide.html#specifying-targets-to-build

一种选择是让bazel为您完成所有更新。如果您已经像这样构建所有内容:bazel build //...,那么在您拉取proto定义更新后,另一个bazel build //...应该只重新构建更改过的内容。

另一种选择是使用bazel query查找所有规则:
https://docs.bazel.build/versions/main/query.html
https://docs.bazel.build/versions/main/query-how-to.html
https://docs.bazel.build/versions/main/query.html#kind

例如:

targets=$(bazel query "kind('java_proto_library', //...)")
bazel build $targets

请注意,使用//...查询将加载工作区中的每个构建文件,但不会构建任何内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接