【问题标题】:Bazel Build Multiple Targets at OnceBazel 一次构建多个目标
【发布时间】:2020-02-01 21:36:57
【问题描述】:

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

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

所以我会跑

bazel build //:build_all

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

有没有办法做到这一点?

【问题讨论】:

  • 我用谷歌搜索找到了这个。也许有帮助:github.com/atlassian/bazel-tools/tree/master/multirun
  • 是的,我在几分钟前尝试过,但它似乎只适用于“可运行”目标。测试和构建给了我一个错误。但也许你可以证明我错了:)
  • 您应该将您的服务设置为 build_all 的依赖项。通常,“数据”是最灵活的属性。但也要知道 bazel build //... 将构建所有内容,而 bazel build //services/... 将构建所有服务下的内容。

标签: bazel bazel-rules


【解决方案1】:

看起来filegroup 是一个现成的规则,可能会被滥用:

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

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

【讨论】:

  • 当 srcs 中列出 py_binary 规则时,这对我不起作用。当它们的源更新时,它不会默默地重建它们。那么我需要回去直接在py_binary规则上调用bazel build。
  • 如果我必须为构建目标传递参数怎么办?例如:“bazel build //services/service1:build -- -arg1 -arg2”
【解决方案2】:

因为我试图部署多个 Kubernetes 配置,所以我最终将 Multi-Object Actions 用于 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",
   ]
)

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      例如

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-16
        • 2021-08-19
        • 1970-01-01
        • 1970-01-01
        • 2012-12-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多