首页 > 解决方案 > 无法打开应位于基本路径中的文件

问题描述

我有一个 Go 项目(bazel-remote),当使用 bazel 构建时,它尝试读取在命令行中传递的 yaml 文件。这个 yaml 文件位于我运行bazel 运行的同一位置命令

但它无法运行,因为 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/ main '

如何正确设置我的 basePath?为什么我的 basePath 设置为它所在的位置?

标签: gobazel

解决方案


开始的二进制文件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设置 this)。这给出了bazel run调用目录的路径。此外,BUILD_WORKSPACE_DIRECTORY是工作区根目录的路径。


推荐阅读