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

由网友(萌酱)分享简介:我正在对Golang使用Bazel,但问题不是Go特定的。我有一个通用的GO目录结构:cmd/├── mycommand/│ ├── BUILD.bazel│ ├── main.go│ └── somefolder│ └── other.go├── othercommand/│...

我正在对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 dagger系列 二 续之Bazel构建java项目 官网的翻译

问题:如何在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列表。

阅读全文

相关推荐

最新文章