无法打开应位于基本路径中的文件

时间:2019-01-01 00:23:47

标签: go bazel

我有一个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设置为原来的位置?

1 个答案:

答案 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.Getwdfilepath.Walk进行调试。

您提到您想访问通过命令行传递的yaml文件。大概,您希望能够访问用户传递的任何文件,而不仅仅是data属性中提到的文件。对于这种情况,请看一下BUILD_WORKING_DIRECTORY环境变量(bazel run对此进行了设置)。这给出了调用bazel run的目录的路径。另外,BUILD_WORKSPACE_DIRECTORY是工作空间根目录的路径。