Bazel:如何获取我在 bazel 测试中构建的二进制文件的路径
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 文件构建一个 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”的绝对路径?
简单运行;
bazel build //some/of/my/path:my_test
它应该将二进制文件的路径打印到标准输出。
作为您当前方法的替代方法,我建议您使用 bazelbuild/rules_docker#go_image,这是一种用于构建容器的 Bazel 感知方法。
编辑:OP 已经澄清了这个问题,但我保留上面的原始答案,因为其他人可能会觉得它有用。
当你把一个binary/test和一些数据捆绑在一起时,data属性下的文件就变成了一组'runfiles'。每种语言都有各种库来解析 运行 文件。对于 golang,您需要使用 rules_go 中的 bazel pkg 来解析您的 运行 文件。例如
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",
...
],
)
你的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}
}
我正在用 bazel 编写一个 go 测试。测试将首先构建一个二进制文件,并将二进制文件安装到 docker 容器中。所以我需要知道我构建的二进制文件的路径。
文件系统结构是这样的:
目录结构如下所示:
some/of/my/path
├── BUILD.bazel
├── my_test.go
└── my_tool
├── BUILD.bazel
└── my_tool.go
我想在 my_tool
目录中用 go 文件构建一个 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”的绝对路径?
简单运行;
bazel build //some/of/my/path:my_test
它应该将二进制文件的路径打印到标准输出。
作为您当前方法的替代方法,我建议您使用 bazelbuild/rules_docker#go_image,这是一种用于构建容器的 Bazel 感知方法。
编辑:OP 已经澄清了这个问题,但我保留上面的原始答案,因为其他人可能会觉得它有用。
当你把一个binary/test和一些数据捆绑在一起时,data属性下的文件就变成了一组'runfiles'。每种语言都有各种库来解析 运行 文件。对于 golang,您需要使用 rules_go 中的 bazel pkg 来解析您的 运行 文件。例如
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",
...
],
)
你的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}
}