所以我有一个非常基本的配置,让Viper从我的基目录中读取一个.env文件。如果没有.env文件,我会致命地终止进程。当我的应用程序正常运行时,一切都很顺利。当我使用go test -v ./..运行测试时,测试框架似乎进入了每个文件的目录,并且每次都调用我的config init()函数,因此viper.AddConfigPath(".")指向了错误的位置。
这是我的目录结构:
/
/restapi
items.go
items_test.go
/util
env.go
main.go
.envenv.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()调用。有点新鲜事。或者,环境变量的这种结构设置不会工作,因为它每次都无法通过测试?
发布于 2021-03-30 09:59:43
因此,显然viper.SetConfigFile()调用并不尊重viper.AddConfigPath()调用...我将其修改为使用viper.SetConfigName(".env"),它实际上会拾取对AddConfigPath的调用,这样我就可以为当前目录和父目录添加配置路径。
发布于 2021-06-07 22:54:02
问题在于您提供给viper.AddConfigPath(".")方法的路径,但是您的环境文件相对路径不在基于您共享的文件夹结构树的测试文件上,它必须是:viper.AddConfigPath("./../util")。
https://stackoverflow.com/questions/66683505
复制相似问题