在构建文件中使用 `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/...))'
//cmd/mycommand:mycommand
//cmd/othercommand:othercommand
问题:如何将此查询包含在 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 列表,这发生在执行阶段之前。
我将 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/...))'
//cmd/mycommand:mycommand
//cmd/othercommand:othercommand
问题:如何将此查询包含在 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 列表,这发生在执行阶段之前。