我有一个 Go 项目(bazel-remote),当使用 Bazel 构建时,它尝试读取在命令行中传递的 YAML 文件。此 YAML 文件位于与我运行bazel run命令的位置相同的位置。
但它无法运行,因为os.Open失败了_no such file or directory_。
我打印了basePathusing os.Getwd,因为有人建议我的basePath可能设置错误。但 mybasePath设置为 my 中/private/var/tmp/创建和存储 Bazel 对象的位置:
/private/var/tmp/_bazel`_`<username>``/312feba8ddcde6737ae7dd7ef9bc2a5a/execroot/__main__/bazel-out/darwin-fastbuild/bin/darwin_amd64_static_pure_stripped/bazel-remote.runfiles/__main`__
Run Code Online (Sandbox Code Playgroud)
我该如何basePath正确设置?为什么我的basePath设置在原来的位置?
以 开头的二进制文件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"],
)
Run Code Online (Sandbox Code Playgroud)
请注意,二进制文件的工作目录对应于存储库根目录,而不是定义二进制文件的目录。您可以使用os.Getwd和进行调试filepath.Walk。
您提到您想要访问在命令行中传递的 yaml 文件。据推测,您希望能够访问用户传入的任何文件,而不仅仅是属性中提到的文件data。对于这种情况,请查看BUILD_WORKING_DIRECTORY环境变量(bazel run设置此变量)。这给出了被调用的目录的路径bazel run。另外,BUILD_WORKSPACE_DIRECTORY是工作区根目录的路径。