英文:
Bazel: how to get the path of a binary that I built along a bazel test
问题
我正在使用bazel编写一个go测试。测试将首先构建一个二进制文件,然后将该二进制文件挂载到一个Docker容器中。因此,我需要知道我构建的二进制文件的路径。
文件系统结构如下:
目录结构如下所示:
some/of/my/path
├── BUILD.bazel
├── my_test.go
└── my_tool
├── BUILD.bazel
└── my_tool.go
我想在my_tool
目录下构建一个包含go文件的二进制文件。
根据我之前问题的答案,我知道可以使用some/of/my/path/BUILD.bazel
中的go_test
的data
条目来构建二进制文件:
go_test(
name = "my_test",
srcs = ["my_test.go"],
data = glob(["testdata/**"]) + [
"//some/of/my/path/my_tool:my_tool",
],
gotags = ["my_test"],
deps = [
"//pkg/util/contextutil",
"//pkg/util/log",
...
],
)
这确实构建了my_tool
的go二进制文件。但现在的问题是,在my_test.go
中,我如何知道my_tool
的构建二进制文件在哪里?
在my_test.go
中,我需要写类似这样的代码:
package my_lucky_test
...
pathForMyTool := some_path
hostConfig := container.HostConfig{
Binds := []string {"%s/my_tool-bin:/workding-dir/my_tool-bin", pathForMyTool}
}
我的问题是,我如何获取"my_tool-bin"的绝对路径?
英文:
I'm writing a go test with bazel. The test will build a binary first, and mount the binary to a docker container. So I need to know the path of the binary I built.
The file system structure is like this:
The dir structure looks like the following:
some/of/my/path
├── BUILD.bazel
├── my_test.go
└── my_tool
├── BUILD.bazel
└── my_tool.go
where I'd like to build a go binary with go files at my_tool
dir.
From my previous question's answer, I got to know that I can use the data
entry of in go_test
from some/of/my/path/BUILD.bazel
to build the binary:
go_test(
name = "my_test",
srcs = ["my_test.go"],
data = glob(["testdata/**"]) + [
"//some/of/my/path/my_tool:my_tool",
],
gotags = ["my_test"],
deps = [
"//pkg/util/contextutil",
"//pkg/util/log",
...
],
)
which did build the go binary for my_tool
. But now the question is, how do I know where is the built binary of my_tool
in my_test.go
?
In my_test.go
, I need to write something like this:
package my_lucky_test
...
pathForMyTool := some_path
hostConfig := container.HostConfig{
Binds := []string {""%s/my_tool-bin:/workding-dir/my_tool-bin", pathForMyTool"}
}
My question is how can I get the absolute path of "my_tool-bin"?
答案1
得分: 1
只返回翻译的部分:
只需运行:
bazel build //some/of/my/path:my_test
它应该将二进制文件的路径打印到标准输出。
作为对你当前方法的替代,我建议你使用bazelbuild/rules_docker#go_image,这是一个用于构建容器的Bazel感知方法。
编辑:OP已经澄清了问题,但我将保留上面的原始答案,因为其他人可能会发现它有用。
当你将二进制文件/测试与一些数据捆绑在一起时,数据属性下的文件将成为一组'runfiles'。每种语言都有各种库来解析runfiles。对于golang,你需要使用rules_go中的bazel pkg来解析你的runfiles。例如:
go_test(
name = "my_test",
srcs = ["my_test.go"],
data = glob(["testdata/**"]) + [
"//some/of/my/path/my_tool:my_tool",
],
gotags = ["my_test"],
deps = [
"//pkg/util/contextutil",
"//pkg/util/log",
# 新的依赖项
"@rules_go//rules_go/go/tools/bazel",
...
],
)
你的my_test.go
文件:
package my_lucky_test
# 新的导入
import(
"github.com/bazelbuild/rules_go/go/tools/bazel"
)
#...
pathForMyTool, ok := bazel.FindBinary("some/of/my/path/my_tool", "my_tool")
if !ok {
# 错误处理
}
hostConfig := container.HostConfig{
Binds := []string {"%s/my_tool-bin:/workding-dir/my_tool-bin", pathForMyTool}
}
英文:
Simply run;
bazel build //some/of/my/path:my_test
It should print out the path of the binary to stdout.
As an alternative to your current approach might I suggest that you make use of bazelbuild/rules_docker#go_image which is a Bazel aware method for building containers.
EDIT: OP has clarified the question, though I am leaving the original answer above as others may find it useful.
When you bundle a binary/test with some data, the files under the data attribute become a set of 'runfiles'. There are various libraries in each language for resolving runfiles. For golang you'll want to use the bazel pkg in rules_go, to resolve your runfiles. e.g.
go_test(
name = "my_test",
srcs = ["my_test.go"],
data = glob(["testdata/**"]) + [
"//some/of/my/path/my_tool:my_tool",
],
gotags = ["my_test"],
deps = [
"//pkg/util/contextutil",
"//pkg/util/log",
# NEW dep
"@rules_go//rules_go/go/tools/bazel",
...
],
)
Your my_test.go
;
package my_lucky_test
# NEW
import(
"github.com/bazelbuild/rules_go/go/tools/bazel"
)
#...
pathForMyTool, ok := bazel.FindBinary("some/of/my/path/my_tool", "my_tool")
if !ok {
# Error handling
}
hostConfig := container.HostConfig{
Binds := []string {""%s/my_tool-bin:/workding-dir/my_tool-bin", pathForMyTool}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论