什么是Viper?
Viper 是一个完整的 Go 应用程序配置解决方案,包括 12-Factor 应用程序。 它被设计为在应用程序中工作,并且可以处理所有类型的配置需求和格式。
它支持:
设置默认值 从 JSON、TOML、YAML、HCL、envfile 和 Java 属性配置文件读取
实时监视和重新读取配置文件(可选)
从环境变量读取 从远程配置系统(etcd 或 Consul)
读取并监视 更改从命令行读取标志从缓冲区读取设置显式值
Viper 可以满足所有应用程序配置需求。
为什么是Viper?
在构建应用程序时,你不会想要花费过多时间在配置文件上的
想专注于构建出色的软件?Viper 可以为您提供帮助。
Viper 会为您执行以下操作:
1/查找、加载和解构 JSON、TOML、YAML、HCL、INI、envfile 或 Java 属性格式的配置文件。
2.为不同的应用程序提供不同的默认配置。
3.提供一种机制覆盖通过命令行标志指定的选项。
4.提供别名系统,可以轻松重命名参数,而不会破坏现有代码。
5.可以轻松区分用户提供的命令行选项或配置文件与默认值相同的情况。
Viper 使用以下优先顺序。 每个项目优先于其下面的项目:
- explicit call to
Set
- flag
- env
- config
- key/value store
- default
重要提示:Viper 配置键不区分大小写。 关于将其设为可选的讨论正在进行中。
让我们来让Viper读取数值
从配置文件中读取数据
Viper 需要最少的配置,因此它知道在哪里查找配置文件。 Viper 支持 JSON、TOML、YAML、HCL、INI、envfile 和 Java Properties 文件。 Viper 可以搜索多个路径,但目前单个 Viper 实例仅支持单个配置文件。 Viper 不默认使用任何配置搜索路径,将默认决定留给应用程序。
下面是如何使用 Viper 搜索和读取配置文件的示例。 不需要指定任何特定路径,但至少应在需要配置文件的位置提供一个路径。
viper.SetConfigName("config") // config文件的名字 (不带扩展名需设置config文件的扩展类型)
viper.SetConfigType("yaml") // 上一条未设置扩展名(像是.json)在这里设置
viper.AddConfigPath("/etc/appname/") // config文件所在的文件夹路径
viper.AddConfigPath("$HOME/.appname") // 多次使用AddConfigPath可以加上多个搜索路径
viper.AddConfigPath(".") // (可选)在当前目录中查找配置
err := viper.ReadInConfig() // 查找并读取配置文件
if err != nil { // 处理在读取配置文件中遇到的问题
panic(fmt.Errorf("fatal error config file: %w", err))
}
您可以为处理找不到配置文件的特定情况进行处理,如下所示:
if err := viper.ReadInConfig(); err != nil {
if _, ok := err.(viper.ConfigFileNotFoundError); ok {
// 忽视未找到配置文件的错误
} else {
// 找到配置文件,但产生另一个错误
}
}
// 成功找到配置文件并未错误
注意 [自 1.6 起]:您还可以拥有不带扩展名的文件并以编程方式指定格式。 对于那些位于指定目录中且没有任何扩展名(如 .bashrc)的文件
写入配置文件
从配置文件中读取很有用,但有时您希望存储在运行时所做的所有修改。 为此,可以使用一堆命令,每个命令都有自己的用途:
WriteConfig - 将当前 viper 配置写入预定义路径(如果存在)。 如果没有预定义路径,则会出错。 将覆盖当前配置文件(如果存在)。
SafeWriteConfig - 将当前 viper 配置写入预定义路径。 如果没有预定义路径,则会出错。 不会覆盖当前配置文件(如果存在)。
WriteConfigAs - 将当前的 viper 配置写入给定的文件路径。 将覆盖给定文件(如果存在)。
SafeWriteConfigAs - 将当前的 viper 配置写入给定的文件路径。 不会覆盖给定文件(如果存在)。
根据经验,标有安全的所有内容都不会覆盖任何文件,而只是在不存在时创建,而默认行为是创建或截断。一个小示例部分:
viper.WriteConfig() // writes current config to predefined path set by 'viper.AddConfigPath()' and 'viper.SetConfigName'
viper.SafeWriteConfig()
viper.WriteConfigAs("/path/to/my/.config")
viper.SafeWriteConfigAs("/path/to/my/.config") // will error since it has already been written
viper.SafeWriteConfigAs("/path/to/my/.other_config")
2.读取配置
在 Viper 中,根据值的类型,有几种获取值的方法。 存在以下函数和方法:
Get(key string) : interface{}
GetBool(key string) : bool
GetFloat64(key string) : float64
GetInt(key string) : int
GetIntSlice(key string) : []int
GetString(key string) : string
GetStringMap(key string) : map[string]interface{}
GetStringMapString(key string) : map[string]string
GetStringSlice(key string) : []string
GetTime(key string) : time.Time
GetDuration(key string) : time.Duration
IsSet(key string) : bool
AllSettings() : map[string]interface{}
EX: