解决非主包中的相对路径的问题

时间:2019-03-11 15:29:56

标签: go relative-path

我在解析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包,尤其是filepath.Abs function的SO答案,它们将相对路径转换为绝对路径。但是,这不能解决我的问题,因为绝对路径将基于错误的工作目录。

  • 使用基于GOPATH的“绝对路径” 的某些解决方案可能就足够了,但是我想在构建和导出代码时,GOPATH的意义不大。

  • 仅将所有配置文件都移植到硬编码的Go结构中是不可行的,因为它们是跨语言使用的。

1 个答案:

答案 0 :(得分:1)

依赖源中的配置文件路径不仅是单元测试中的问题,而且在生产中也将是一个问题。通常,代码会执行以下操作:

  • 配置处理程序接受io.Reader,它将从中读取配置。
  • main将打开一个文件(其路径可能是硬编码的,通过命令行传递的,通过env var传递的等),然后将其传递给配置处理程序以供读取。
  • 配置处理程序的单元测试将改为将一个配置(或多个配置,以测试不同的场景)硬编码为bytes.Buffer之类的内容,并将其传递给配置处理程序以供读取。
  • 除读取配置文件的代码以外的任何内容的单元测试(因此,使用但不操作的任何内容)都会生成{{ 1}}使用代码结构,而不是从真实的伪文件中读取它,作为测试工具的一部分。例如,Config,然后将其传递给被测函数。