我在和bazel一起写个go测试。测试将首先构建一个二进制文件,并将二进制文件挂载到一个坞容器中。所以我需要知道我构建的二进制程序的路径。
文件系统结构如下:
dir结构如下所示:
some/of/my/path
├── BUILD.bazel
├── my_test.go
└── my_tool
├── BUILD.bazel
└── my_tool.go在这里,我想在my_tool dir上构建一个包含go文件的go二进制文件。
在我上一个问题的答案中,我了解到可以使用in go_test From some/of/my/path/BUILD.bazel的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_tool在my_test.go中构建的二进制文件
在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"}
}我的问题是,我如何才能得到“我的工具-宾”的绝对路径?
发布于 2022-02-15 10:42:01
简单地跑;
bazel build //some/of/my/path:my_test它应该打印出二进制到stdout的路径。
作为当前方法的另一种选择,我建议您使用图像,这是一种用于构建容器的Bazel感知方法。
编辑: OP已经澄清了这个问题,尽管我会把原来的答案留在上面,因为其他人可能会觉得它很有用。
当您将二进制/测试与某些数据捆绑在一起时,data属性下的文件就变成了一组“runfiles”。在每种语言中都有用于解析runfile的各种库。对于golang,您需要使用rules_go中的rules_go来解析您的运行文件。例如:
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}
}https://stackoverflow.com/questions/71120426
复制相似问题