go - 解决非主包中的相对路径的问题
问题描述
我在 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
。
我查看了其他提到
path/filepath
包的 SO 答案,尤其是用于将相对路径转换为绝对路径的filepath.Abs
功能。但是,这不会解决我的问题,因为绝对路径将基于错误的工作目录。一些基于 GOPATH的“绝对路径”解决方案可能就足够了,但我想 GOPATH 在构建和导出代码时几乎没有意义。
简单地将所有配置文件移植到硬编码的 Go 结构中也不可行,因为它们是跨语言使用的。
解决方案
依赖源中的配置文件路径不仅是单元测试中的问题,而且在生产中也是一个问题。通常,代码会执行以下操作:
- 配置处理程序接受
io.Reader
它将从中读取配置的一个。 main
将打开一个文件(其路径可能是硬编码的,通过命令行传递,通过 env var 传递等)并将其传递给配置处理程序以供读取。- 配置处理程序的单元测试将改为将配置(或多个配置,以测试不同的场景)硬编码为类似的东西
bytes.Buffer
并将其传递给配置处理程序以读取。 - 除了读取配置文件的代码之外的任何内容的单元测试(因此,任何使用配置但不操纵它的东西)将
Config
在代码中生成结构,而不是从真实或假文件中读取它,作为测试的一部分马具。例如,myConf := config.Config{SomeProp: "foo", OtherProp: true}
然后将其传递给被测函数。
推荐阅读
- javascript - 我的变量在我的渲染方法中未定义
- postgresql - 在postgresql中获取上周星期一到上周星期日的数据
- c++ - 虚拟功能和性能
- date - 将字符串转换为日期并将其保存在swiftui中的不同时区
- python - pytest 提出了测试 ClickException 的正确方法?
- googletest - gtest mock 错误没有匹配的调用函数
- google-cloud-platform - 通过ansible Module为谷歌云存储桶设置retentionPolicy
- javascript - 是否可以通过 http/https 服务器或私有 gitHub 的 url 将自己的代码添加到 SquareSpace 网站?
- git - VSCode 远程:找不到存储库,致命:身份验证失败
- python - 使用漂亮的汤刮掉多个页面