【问题标题】:Handling Viper Config File Path During Go Tests在 Go 测试期间处理 Viper 配置文件路径
【发布时间】:2021-06-07 22:54:02
【问题描述】:

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

这是我的目录结构:

/
  /restapi
    items.go
    items_test.go
  /util
    env.go
  main.go
  .env

env.go

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() 调用。 Go 有点新。或者这种环境变量的结构设置是否无法正常工作,因为它每次都未能通过我的测试?

【问题讨论】:

    标签: go viper-go


    【解决方案1】:

    问题是你给viper.AddConfigPath(".")方法的路径,但是根据你共享的文件夹结构树,你的env文件相对路径不在测试文件上,它必须是:viper.AddConfigPath("./../util")

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-21
        • 2015-12-03
        • 1970-01-01
        • 1970-01-01
        • 2020-04-16
        • 2014-06-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多