go - 无法打开应位于基本路径中的文件
问题描述
我有一个 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 设置为它所在的位置?
解决方案
开始的二进制文件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
是工作区根目录的路径。
推荐阅读
- regex - REGEXP 将单个 FULL NAME 字符串分组,其间有一个或多个空格?
- c++ - return 在 cin 语句之前结束程序
- android - Lint 警告 strings.xml 中被覆盖的字符串未使用
- c++ - 为什么我收到“标识符未定义”错误?
- awk - 我的 awk 脚本中存在问题。-condition:在 awk 中使用变量。- 目标:在文本中打印特定列开始的计数变量
- python - 绝对导入在项目中无法正常工作
- mysql - 无法对简单的 CASE 语句进行 ALIAS
- minecraft - 如何在 Minecraft 基岩版中指定计时功能?
- javascript - 如何在Angular中将blob数据作为文件读取?
- linux - 为什么命令“react-native run-android”在我的 Linux 发行版上不起作用?