在构建文件中使用 `bazel query`

Use `bazel query` inside a build file

我将 Bazel 与 Golang 一起使用,但问题不是特定于 Go 的。我有一个通用的go目录结构:

cmd/
├── mycommand/
│   ├── BUILD.bazel
│   ├── main.go
│   └── somefolder
│       └── other.go
├── othercommand/
│   ├── BUILD.bazel
│   └── main.go
pkg/
└── mypackage/
    ├── BUILD.bazel
    └── init.go
BUILD.bazel
WORKSPACE

...我想引用 cmd 文件夹下的目标。我有一个 bazel 查询,它会给我这些目标的列表:

bazel query 'kind("go_binary", deps(//cmd/...))'

问题:如何将此查询包含在 BUILD.bazel 文件中,如下所示:

pkg_tar(
    name = "release",
    srcs = kind("go_binary", deps(//cmd/...)),
    mode = "0644",
)

...这给出了

ERROR: /some/path/BUILD.bazel:10:12: name 'kind' is not defined
ERROR: /some/path/BUILD.bazel:10:30: name 'deps' is not defined

构建目标需要在构建文件中静态引用,因此嵌入查询作为规则属性的输入不起作用。

但是,有几种方法可以动态生成要在 BUILD 文件中静态使用的目标:

1) 运行 一个在运行 Bazel 之前生成BUILD 文件的工具。 rules_go的瞪羚就是一个很好的例子。

2) 编写一个 repository rule 调用非密封工具来动态生成您的 BUILD 文件可以依赖的目标。

请注意,您可能会遇到 genquery 规则,它确实允许您对目标执行查询,但该规则在 Bazel 的执行阶段输出到 文件 ,而不是可以在分析阶段吸收到其他规则属性的 Starlark 列表,这发生在执行阶段之前