【摘要】
viper是一个简单好用的读取配置文件的第三方开源库,它支持多种类型配置的读写,包括json、yml、环境变量、命令行等,使用该库可以免去一些繁琐的配置读取代码实现。
一 基本原理
当viper被调用来获取参数时,它的基本执行逻辑如下:
1.通过自己的内部实现,获取指定对象(配置文件,环境变量等)的内容
2.将获取的内容解析,得到键值对集合,并将其存入自身的storage中
3.等待ReadInConfig,或GetInt等方法取值
从上面描述可知,无论viper获取参数的来源是什么,最终的参数集合都是viper内部存放的键值对集合,也就可以使用viper.Get等方法获取,这种方案的好处就是,当配置来源发生变化时,只需要修改viper的来源解析代码,而不需要对已经嵌入业务代码的参数读写逻辑做任何修改。
二 使用方法
首先,通过命令go get github.com/spf13/viper 获取viper包
2.1 读取配置文件:
通过指定目录和文件名、文件类型,即可实现对指定文件的配置读取:
viper.SetConfigName("config") // 文件名 viper.AddConfigPath("/etc/appname/") // 文件路径 viper.AddConfigPath("$HOME/.appname") //可以使用多个文件路径 err := viper.ReadInConfig() // 将配置读入viper中存储 err != nil { // Handle errors reading the config file panic(fmt.Errorf("Fatal error config file: %s ", err)) } ... //viper.GetString(...)
2.2 读取配置流:
viper.SetConfigType("yaml") // 设置配置的格式类型 var yamlExample = []byte(...) //...中为yml格式的字符串 viper.ReadConfig(bytes.NewBuffer(yamlExample)) //viper.ReadConfig()可以传入任//何实现io.Reader接口的对象 viper.Get("name") // 使用Get获取刚才读取的结果
2.3 设置参数默认值:
viper.SetDefault("ContentDir", "content") viper.SetDefault("LayoutDir", "layouts") viper.SetDefault("Taxonomies", map[string]string{"tag": "tags", "category": "categories"})
2.4 监听配置文件的读写事件:
配置监听事件后,当文件出现读写操作,就会触发事件,调用其声明好的方法,该步骤通常用于处理配置文件的重载,有时也额外用于文件监控功能
viper.WatchConfig() //启动监听 viper.OnConfigChange(func(e fsnotify.Event) { //注册文件监控的回调函数 fmt.Println("Config file changed:", e.Name) })
2.5 配置参数别名:
配置参数别名后,使用viper.Get方法时,传入原本的key或者传入别名都可以获取指定参数的值,通常用于美化/简化配置文件的参数格式
viper.RegisterAlias("base", "别名") //注册别名 viper.Set("base", true) viper.GetBool("base") //结果: true viper.GetBool("别名") //结果: true
2.6 设置/覆盖参数值:
手动覆盖参数,此处不多赘述
viper.Set("base", true)
2.7 获取命令行参数
viper的命令行参数获取实际上是通过绑定flag对象实现的,使用方法相对其他几种配置来源稍微复杂一点
package main import ( "flag" "github.com/spf13/pflag" ) func main() { // 使用基础的flag包 flag.Int("flagname", 1234, "help message for flagname") //将flag转换为pflag pflag.CommandLine.AddGoFlagSet(flag.CommandLine) pflag.Parse() //通过bind,将命令行参数绑定到viper的内部键值对集合中 viper.BindPFlags(pflag.CommandLine) i := viper.GetInt("flagname") // 此处已可以获取参数
---------------------
原文来自【学领未来】,转载时请保留原文链接。
链接:http://bbs.learnfuture.com/topic/6900