4

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

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

所以我会跑

bazel build //:build_all

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

有没有办法做到这一点?

4

4 回答 4

11

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

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

否则,它允许您为一堆文件(标签)提供一个集体名称,以便方便地传递,但似乎与在命令行上使用的摘要目标一样工作。

于 2020-02-01T23:23:20.363 回答
2

因为我试图部署多个 Kubernetes 配置,所以我最终为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",
   ]
)
于 2020-02-04T07:02:22.273 回答
2

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

于 2021-04-06T14:50:12.773 回答
1

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

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

例如

QUERY="attr(tags, 'tag1', attr(tags, 'tag2', ...))"
BUILD_TARGETS=$(bazel query "$QUERY")
bazel build "$BUILD_TARGETS"
于 2021-07-19T17:06:59.490 回答