hello,大家好,我是聪聪。
文章目录
1. 介绍
Viper是适用于Go应用程序的完整配置解决方案。它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式。它支持以下特性:
- 设置默认值
- 从
JSON
、TOML
、YAML
、HCL
、envfile
和Java properties
格式的配置文件读取配置信息 - 实时监控和重新读取配置文件(可选)
- 从环境变量中读取
- 从远程配置系统(etcd或Consul)读取并监控配置变化
- 从命令行参数读取配置
- 从buffer读取配置
- 显式配置值
Viper能够帮助我们执行以下操作:
-
查找、加载和反序列化
JSON
、TOML
、YAML
、HCL
、INI
、envfile
和Java properties
格式的配置文件。 -
提供一种机制为你的不同配置选项设置默认值,进行灵活配置和发布配置。
-
提供一种机制来通过命令行参数覆盖指定选项的值。
-
提供别名系统,以便在不破坏现有代码的情况下轻松重命名参数。
-
当用户提供了与默认值相同的命令行或配置文件时,可以很容易地分辨出它们之间的区别。
Viper能够按照下列优先级进行获取配置:
- 显示调用
Set
设置值 - 命令行参数(flag)
- 环境变量
- 配置文件
- key/value存储
- 默认值
2. 安装
go get github.com/spf13/viper
3. Viper使用介绍
3.1 设置默认值
Viper支持设置默认值,当我们无法从配置文件、环境变量、远程配置、命令行获取配置时,默认配置到是很有用的。
func main() {
//设置各类key对应默认值
//key 为string类型
//value可接受interface{} 类型参数
viper.SetDefault("rootPath", "rootPath default value")
viper.SetDefault("defaultPort", 8000)
viper.SetDefault("defaultConfig", map[string]string{
"HttpMethod": "HttpMethod default value",
"HttpUrl": "HttpUrl default value",
})
//从viper中读取配置
fmt.Println("rootPath value:", viper.Get("rootPath"))
fmt.Println("defaultPort value:", viper.Get("defaultPort"))
fmt.Println("defaultConfig:", viper.Get("defaultConfig"))
fmt.Println("defaultConfig:", viper.GetStringMapString("defaultConfig"))
}
从Viper中读取配置key对应配置信息。打印信息如下:
rootPath value: rootPath default value
defaultPort value: 8000
defaultConfig: map[httpMethod:GET httpUrl:ccoder.cc]
defaultConfig: map[httpMethod:GET httpUrl:ccoder.cc]
3.2 读取配置文件
Viper读取配置文件时,需要指定告诉配置文件路径(或者读取配置方式)。同时Viper支持从JSON
、TOML
、YAML
、HCL
、envfile
和Java properties
格式的配置文件读取配置信息。同时支持搜索多个路径。
下面是一个从配置文件config.json
读取配置的案例。只用指定配置文件config预期出现的路径,无需指定特定的路径。
//在当前工作目录 . 中读取一个config的配置文件 未指定文件后缀.
func printFile() {
//配置文件名称(无后缀扩展名),viper会自行解析文件后缀名.
//若配置文件无后缀时则需要通过SetConfigType配置后水名
viper.SetConfigName("config")
//可以重复添加的搜索路径
viper.AddConfigPath(".")
//加载配置文件 捕获一下error:文件不存在情况。
err := viper.ReadInConfig()
if err != nil {
if _, ok := err.(viper.ConfigFileNotFoundError); ok {
log.Println("config not exists")
} else {
log.Println("read config error")
}
log.Fatal