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

Rij*_*mon 0 go bazel

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

Jay*_*rod 5

以 开头的二进制文件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是工作区根目录的路径。