go 实用技巧 viper设置配置文件路径
前言
go项目常用viper进行配置管理,本文记录一下在读取配置文件时踩得坑。
踩坑
正常启动项目,和在dao层做单元测试,都使用同样的初始化函数,但是在单元测试调用初始化函数时,出现了无法找到配置文件的问题。
下图为我的项目结构目录。
下面为初始化函数
func Init() error {
v := viper.New()
v.AddConfigPath("./config") // 设置配置文件目录
v.SetConfigName("config") // 设置配置文件名
v.SetConfigType("yaml") // 设置配置文件后缀
v.WatchConfig()
err := v.ReadInConfig()
if err != nil {
panic(fmt.Errorf("read config failed, %v", err))
}
if err := v.Unmarshal(&Conf); err != nil {
panic(fmt.Errorf("unmarshal to Conf failed, %v", err))
}
return err
}
出错原因
主要原因是我对./有误解,我之前以为./的意思是当前文件目录,在go中 ./ 是基于执行命令的目录的,也就是说在不同的目录下调用Init(),./所代表的意义不同。
解决方案
因为是直接获取的config.go文件目录,所以无论在哪里调用配置初始化函数,都不会出现找不到文件的问题了
func Init() error {
v := viper.New()
_, filename, _, _ := runtime.Caller(0) // 获取当前文件(config.go)路径
confPath := path.Dir(filename) // 获取当前文件目录
v.AddConfigPath(confPath)
v.SetConfigName("config")
v.SetConfigType("yaml")
v.WatchConfig()
err := v.ReadInConfig()
if err != nil {
panic(fmt.Errorf("read config failed, %v", err))
}
if err := v.Unmarshal(&Conf); err != nil {
panic(fmt.Errorf("unmarshal to Conf failed, %v", err))
}
return err
}
本作品采用《CC 协议》,转载必须注明作者和本文链接