这是我参与「第五届青训营 」伴学笔记创作活动的第 13 天
场景
在项目开发过程中,像数据库信息、服务器地址、JWT加密等这些固定的信息都会写在配置文件中,而配置文件又有多种表现形式和格式,有 JSON, TOML, YAML各种格式,而且测试环境,开发环境和生产环境用的配置文件也不是同一份。
因此,在此次青训营大项目中,我们引入了 viper 对配置文件进行了读取。下面是对 viper 的介绍。
什么是 viper
viper是一个配置管理的解决方案,它能够从 json,toml,ini,yaml,hcl,env 等多种格式文件中,读取配置内容,它还能从一些远程配置中心读取配置文件,如consul,etcd等;它还能够监听文件的内容变化。
为什么要使用Viper
在构建应用程序时,不必担心配置文件格式。当程序部署在不同位置时,不同的主机可以使用不同的配置文件,而不需要在程序中频繁的修改。
viper 的使用
读取配置文件的优先顺序,从高到低,如下:
- 显式设置的Set函数
- 命令行参数
- 环境变量
- 配置文件
- 远程k-v 存储系统,如consul,etcd等
- 默认值
读取配置文件要求:最少要知道从哪个位置查找配置文件。用户一定要设置这个路径。
viper可以从多个路径搜索配置文件,单个viper实例只支持单个配置文件。 viper本身没有设置默认的搜索路径,需要用户自己设置默认路径。
使用 go get -u github.com/spf13/viper 进行安装
项目中的使用
在此次项目中,仅仅使用了viper对配置文件的读取,在程序启动时调用该方法时读取
func InitViper(path string) *viper.Viper {
v := viper.New()
v.SetConfigFile(path)
v.SetConfigType("yaml")
if err := v.ReadInConfig(); err != nil {
fmt.Printf("Fatal error config file: %v\n", err)
panic(err)
}
if err := v.Unmarshal(&global.CONFIG); err != nil {
fmt.Printf("Fatal error unmarshal: %v\n", err)
panic(err)
}
return v
}