Viper

2019-02-24
Golang

viper是什么

viper是Go应用、12-Factor应用的配置解决方案。它被用在应用之中,可以处理几乎所有的配置需求和格式,支持:

  • 默认配置
  • 从JSON、TOML、YAML、HCL和Java配置中读取
  • 监听重载配置文件(可选功能)
  • 读取环境变量
  • 读取远程配置吸引,如etcd或者Consul,监听这些的变化
  • 从命令行的flag读取
  • 从缓存读取
  • 设置明确值

当我们在创建现代化的应用时,我们不需要担心配置文件格式的问题,viper都能解决:

  • 从JSON、TOML、YAML、HCL和Java配置中查找,加载和序列化
  • 可以为不同的配置文件设置不同的默认值
  • 可以通过命令行的flags方式设置覆盖值
  • 可以在不修改代码的情况下,设置相等值来把参数重命名
  • 能分辨命令行提供的参数和配置文件默认参数的不同

以下从这个几个方面来详细了解viper:

  • set
  • flag
  • env
  • config
  • key/value store
  • default

使用

设置默认值

1
2
3
viper.SetDefault("ContentDir", "content")
viper.SetDefault("LayoutDir", "layouts")
viper.SetDefault("Taxonomies", map[string]string{"tag": "tags", "category": "categories"})

从配置文件读取

使用viper来读取文件,需要提供文件的路径(可以设置多个路径),如下:

1
2
3
4
5
6
7
8
viper.SetConfigName("config") // name of config file (without extension)
viper.AddConfigPath("/etc/appname/") // path to look for the config file in
viper.AddConfigPath("$HOME/.appname") // call multiple times to add many search paths
viper.AddConfigPath(".") // optionally look for config in the working directory
err := viper.ReadInConfig() // Find and read the config file
if err != nil { // Handle errors reading the config file
panic(fmt.Errorf("Fatal error config file: %s \n", err))
}

监听重新读取配置文件

应用不需要重启,当配置文件出现改动时,就会自动去重新读取文件:

1
2
3
4
viper.WatchConfig()
viper.OnConfigChange(func(e fsnotify.Event) {
fmt.Println("Config file changed:", e.Name)
})

参考:

https://www.cnblogs.com/cnblogs-wangzhipeng/p/9484460.html

https://github.com/spf13/viper#working-with-flags