我有一个Go项目(bazel-remote),当使用bazel构建时,该项目尝试读取在命令行中传递的yaml文件。这个yaml文件与我运行 bazel run 命令的位置相同。
但是它无法运行,因为os.Open失败, 没有这样的文件或目录 。
我使用os.Getwd打印了basePath,因为有人建议我的basePath可能设置错误。但是我的basePath设置为我的/ private / var / tmp /中创建和存储bazel对象的位置:
/ private / var / tmp / bazel / 312feba8ddcde6737ae7dd7ef9bc2a5a / execroot / main /bazel-out/darwin-fastbuild/bin/darwin_amd64_static_pure_stripped/bazel-remote.runfiles/ 主要'
如何正确设置basePath?为什么我的basePath设置为原来的位置?
答案 0 :(得分:2)
以bazel run
开头的二进制文件在内部的Bazel目录中执行。他们将有权访问“运行文件”,即二进制规则的data
属性或其依赖项中提到的文件。例如,如果您有以下规则,则可以读取foo.txt
,但不能读取bar.txt
或其他文件:
load("@io_bazel_rules_go//go:def.bzl", "go_binary")
go_binary(
name = "hello",
srcs = ["hello.go"],
data = ["foo.txt"],
)
请注意,二进制文件的工作目录对应于存储库根目录,而不是定义二进制文件的目录。您可以使用os.Getwd
和filepath.Walk
进行调试。
您提到您想访问通过命令行传递的yaml文件。大概,您希望能够访问用户传递的任何文件,而不仅仅是data
属性中提到的文件。对于这种情况,请看一下BUILD_WORKING_DIRECTORY
环境变量(bazel run
对此进行了设置)。这给出了调用bazel run
的目录的路径。另外,BUILD_WORKSPACE_DIRECTORY
是工作空间根目录的路径。