go 实用技巧 viper设置配置文件路径

前言

go项目常用viper进行配置管理,本文记录一下在读取配置文件时踩得坑。

踩坑

正常启动项目,和在dao层做单元测试,都使用同样的初始化函数,但是在单元测试调用初始化函数时,出现了无法找到配置文件的问题。

下图为我的项目结构目录。

image.png

下面为初始化函数

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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!