首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Go测试期间处理Viper配置文件路径

在Go测试期间处理Viper配置文件路径
EN

Stack Overflow用户
提问于 2021-03-18 09:24:10
回答 2查看 548关注 0票数 3

所以我有一个非常基本的配置,让Viper从我的基目录中读取一个.env文件。如果没有.env文件,我会致命地终止进程。当我的应用程序正常运行时,一切都很顺利。当我使用go test -v ./..运行测试时,测试框架似乎进入了每个文件的目录,并且每次都调用我的config init()函数,因此viper.AddConfigPath(".")指向了错误的位置。

这是我的目录结构:

代码语言:javascript
复制
/
  /restapi
    items.go
    items_test.go
  /util
    env.go
  main.go
  .env

env.go

代码语言:javascript
复制
package util

imports...

// global variables available via util package
var (
  Port     int
  DbURI    string
)

func init() {
  viper.SetDefault(PORT, 8080)
  viper.SetConfigFile(".env")
  viper.AddConfigPath(".")
  viper.AutomaticEnv()

  fmt.Println("---------to see in test printout")
  cwd, _ := os.Getwd()
  fmt.Println(cwd)
  fmt.Println("---------")

  if err := viper.ReadInConfig(); err != nil {
    log.Fatal("no environment file!")
  }

  Port = viper.GetInt("PORT")
  DbURI = viper.GetString("DB_URI")
}

每个包基本上都依赖于我的util包,因此每次测试都会运行这个init函数。有没有办法让viper总是从基本目录中拉出.env文件,即使有测试在运行?我尝试了几种不同的AddConfigPath()调用。有点新鲜事。或者,环境变量的这种结构设置不会工作,因为它每次都无法通过测试?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-30 09:59:43

因此,显然viper.SetConfigFile()调用并不尊重viper.AddConfigPath()调用...我将其修改为使用viper.SetConfigName(".env"),它实际上会拾取对AddConfigPath的调用,这样我就可以为当前目录和父目录添加配置路径。

票数 -1
EN

Stack Overflow用户

发布于 2021-06-07 22:54:02

问题在于您提供给viper.AddConfigPath(".")方法的路径,但是您的环境文件相对路径不在基于您共享的文件夹结构树的测试文件上,它必须是:viper.AddConfigPath("./../util")

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66683505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档