Bazel 一次构建多个目标

Bazel Build Multiple Targets at Once

我想要一个能够同时构建多个目标的 Bazel 规则。所以基本上是这样的:

build_all(
  name = "build_all",
  targets = [
    "//services/service1:build",
    "//services/service2:build",
    "//services/service3:build",
  ]
)

所以我会 运行

bazel build //:build_all

用一个简单的命令构建我所有的服务(测试也是如此)。但是我找不到任何当前的解决方案。

有办法实现吗?

filegroup 似乎是一个现成的规则,可以被滥用于以下目的:

filegroup(
  name = "build_all",
  srcs = [
    "//services/service1:build",
    "//services/service2:build",
    "//services/service3:build",
  ]
)

否则它允许您为一堆文件(标签)指定一个集合名称以便于传递,但似乎与在命令行上使用的摘要目标一样有效。

因为我试图部署多个 Kubernetes 配置,所以我最终使用了 Multi-Object Actions for rules_k8s,它看起来像:

load("@io_bazel_rules_k8s//k8s:objects.bzl", "k8s_objects")

k8s_objects(
   name = "deployments",
   objects = [
      "//services/service1:build",
      "//services/service2:build",
      "//services/service3:build",
   ]
)

如果您只想要构建目标的一个子集,其他答案可能更好,但您也可以尝试 bazel build :allbazel test :all

您还可以使用 --build_tag_filters 有选择地构建具有给定标签的多个目标。

编辑: --build_tag_filters 正在使用 OR 逻辑。如果你想构建满足多个标签的目标,我建议你先查询它,然后再构建结果目标。

例如

QUERY="attr(tags, 'tag1', attr(tags, 'tag2', ...))"
BUILD_TARGETS=$(bazel query "$QUERY")
bazel build "$BUILD_TARGETS"