【发布时间】:2026-02-13 18:10:01
【问题描述】:
我在解析 Go 应用程序中的相对文件路径时遇到问题。对于这个应用程序,我决定制作一个包,为不同的配置文件提供统一的接口。 conf 包包含相关的数据文件,所以这基本上是文件树:
app/conf
+ config.go
+ config.json
+ ...
app/code
+ code.go
+ code_test.go
问题是,当app/code/code_test.go 中定义的测试调用app/conf 包中的函数时,该函数又试图打开app/conf/config.json,由于工作目录位于app/code,因此相对路径被弄乱了。
我查看了其他 SO 答案,其中提到了
path/filepath包,尤其是filepath.Absfunction 用于将相对路径转换为绝对路径。但是,这并不能解决我的问题,因为绝对路径将基于错误的工作目录。-
一些基于 GOPATH 的 “绝对路径” 解决方案可能就足够了,但我想在构建和导出代码时 GOPATH 将没有什么意义。
李> 简单地将所有配置文件移植到硬编码的 Go 结构中也不可行,因为它们是跨语言使用的。
【问题讨论】:
-
你只有在你的测试文件中有这个问题吗?我问是因为它们不包含在最终版本中。所以在你构建和部署你的应用程序之后,将没有
code_test.go来执行app/conf中的函数... -
@mkopriva 对不起,我不清楚,这些函数是从实际的实施文件中调用的(在上面的例子中是
code.go),但是这些函数也会从实际的main包中调用,即不仅在测试中。 -
然后您可以指示您的用户将配置文件安装在已知位置,无论是绝对位置还是相对于二进制文件的位置由您决定。或者,您可以指示您的用户提供配置的位置,作为 cli arg 或 env var,或两者兼而有之。
-
... 第三种选择是将配置“嵌入”到最终的二进制文件中。 go 命令不支持开箱即用,但有 3rd 方库可以为您做到这一点。
-
是的,谢谢,我正在考虑这样的解决方案;例如指导用户定义一些环境变量等,但我想知道是否有更好和更传统的解决方案,对 Go 来说更“原生”。
标签: go relative-path