如何“bazel构建”使用特定规则的所有目标?

Noe*_*Yap 5 bazel

我们开始使用 gRPC,目前正在用作bazel我们的构建工具。工程师更新原型定义后,他们需要进行原型编译。由于我们存储库的结构,原始编译目标将分散在存储库中。

我看到的唯一选择是使用目标命名约定,因此工程师只需要执行类似bazel build //...:compile-proto. 是否有其他方法可以让工程师轻松地对所有更新的原型定义进行原型编译?

Bri*_*man 6

如果为每个标签添加特定标签,则可以使用--build_tag_filters

例如:

a_proto_library(
  name = "compile-proto",
  tags = ["a_proto"],
  [...]
)
Run Code Online (Sandbox Code Playgroud)

进而bazel build --build_tag_filters=a_proto //...

您还可以将规则包装在中以自动添加标签。


ahu*_*sky 2

我不认为//...:compile-proto这是一个有效的目标模式,所以不幸的是我不确定这是否有效(并不是说你一定真的想依赖命名约定)。请参阅https://docs.bazel.build/versions/main/guide.html#specifying-targets-to-build

一种选择是让 bazel 为您完成所有更新。如果您已经在进行类似于bazel build //...构建所有内容的构建,那么一旦您引入了原始定义的更新,另一个bazel build //...应该仅重建已更改的内容。

另一种选择是使用 bazel 查询查找所有规则:
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
Run Code Online (Sandbox Code Playgroud)

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