在构建文件中使用`bazel query` [英] Use `bazel query` inside a build file
本文介绍了在构建文件中使用`bazel query`的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在对Golang使用Bazel,但问题不是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
推荐答案
生成文件中需要静态引用生成目标,因此将查询作为输入嵌入到规则属性不起作用。
但是,有几种方法可以动态生成在构建文件中静态使用的目标:
1)在运行Bazel之前运行生成构建文件的工具。Rules_Go的瞪羚就是一个很好的例子。 2)编写一个repository rule,它调用非封闭工具来动态生成构建文件可以依赖的目标。注意,您可能会遇到genquery
规则,它确实允许您对目标执行查询,但该规则在Bazel的执行阶段输出到文件,而不是在执行阶段之前发生的分析阶段可以摄取其他规则的属性的Starlark列表。
这篇关于在构建文件中使用`bazel query`的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文