Go 语言之 Viper 的使用
Viper 介绍
Viper:https://github.com/spf13/viper
安装
go get github.com/spf13/viper
Viper 是什么?
Viper 是一个针对 Go 应用程序的完整配置解决方案,包括12-Factor 应用程序。它可以在应用程序中工作,并且可以处理所有类型的配置需求和格式。它支持:
Viper is a complete configuration solution for Go applications including 12-Factor apps. It is designed to work within an application, and can handle all types of configuration needs and formats. It supports:
- setting defaults
- reading from JSON, TOML, YAML, HCL, envfile and Java properties config files
- live watching and re-reading of config files (optional)
- reading from environment variables
- reading from remote config systems (etcd or Consul), and watching changes
- reading from command line flags
- reading from buffer
- setting explicit values
Viper can be thought of as a registry for all of your applications configuration needs.
Viper 可以被认为是满足所有应用程序配置需求的注册表。
为什么使用 Viper?
在构建现代应用程序时,您不需要担心配置文件格式; 您需要专注于构建令人满意的软件。Viper 就是为此而生的。
Viper 可以为你做以下事情:
- Find, load, and unmarshal a configuration file in JSON, TOML, YAML, HCL, INI, envfile or Java properties formats.
- Provide a mechanism to set default values for your different configuration options.
- Provide a mechanism to set override values for options specified through command line flags.
- Provide an alias system to easily rename parameters without breaking existing code.
- Make it easy to tell the difference between when a user has provided a command line or config file which is the same as the default.
Viper uses the following precedence order. Each item takes precedence over the item below it:
- explicit call to
Set
- flag
- env
- config
- key/value store
- default
Important: Viper configuration keys are case insensitive. There are ongoing discussions about making that optional.
重要提示: Viper 配置键是不区分大小写的。目前正在讨论是否将其设置为可选的。
Viper 实操 Putting Values into Viper
建立默认值
一个好的配置系统将支持默认值。密钥不需要默认值,但如果没有通过配置文件、环境变量、远程配置或标志设置密钥,则默认值非常有用。
Examples:
viper.SetDefault("ContentDir", "content")
viper.SetDefault("LayoutDir", "layouts")
viper.SetDefault("Taxonomies", map[string]string{"tag": "tags", "category": "categories"})
读取配置文件
Viper 需要最小的配置,这样它就知道在哪里查找配置文件。Viper 支持 JSON、 TOML、 YAML、 HCL、 INI、 envfile 和 JavaProperties 文件。Viper 可以搜索多个路径,但目前单个 Viper 实例只支持单个配置文件。Viper 不默认任何配置搜索路径,将默认决策留给应用程序。
下面是如何使用 Viper 搜索和读取配置文件的示例。不需要任何特定的路径,但至少应该在需要配置文件的地方提供一个路径。
viper.SetConfigName("config") // name of config file (without extension)
viper.SetConfigType("yaml") // REQUIRED if the config file does not have the extension in the name
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: %w", err))
}
您可以处理没有如下配置文件的特定情况:
if err := viper.ReadInConfig(); err != nil {
if _, ok := err.(viper.ConfigFileNotFoundError); ok {
// Config file not found; ignore error if desired
} else {
// Config file was found but another error was produced
}
}
// Config file found and successfully parsed
写入配置文件
从配置文件中读取是有用的,但有时您希望存储在运行时所做的所有修改。为此,提供了一系列命令,每个命令都有自己的用途:
- WriteConfig-将当前 viper 配置写入预定义的路径(如果存在)。如果没有预定义的路径就会出错。将覆盖当前配置文件(如果存在)。
- SafeWriteConfig-将当前 viper 配置写入预定义的路径。如果没有预定义的路径就会出错。不会覆盖当前配置文件(如果存在)。
- WriteConfigAs-将当前 viper 配置写入给定的文件路径。将覆盖给定的文件(如果存在)。
- SafeWriteConfigAs-将当前 viper 配置写入给定的文件路径。不会覆盖给定的文件(如果存在)。
As a rule of the thumb, everything marked with safe won't overwrite any file, but just create if not existent, whilst the default behavior is to create or truncate.
根据经验,所有标记为 safe 的文件都不会覆盖任何文件,只是创建(如果不存在的话) ,而默认行为是创建或截断。
A small examples section:
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")
监视和重新读取配置文件
Viper 支持让应用程序在运行时实时读取配置文件的能力。
需要重新启动服务器才能使配置生效的日子已经一去不复返了,使用 viper 的应用程序可以在运行时读取配置文件的更新,而且不会错过任何一次更新。
只需告诉 viper 实例监视 Config。您还可以为 Viper 提供一个函数,以便在每次发生更改时运行该函数。
确保在调用 WatchConfig ()之前添加了所有的 configPath
viper.OnConfigChange(func(e fsnotify.Event) {
fmt.Println("Config file changed:", e.Name)
})
viper.WatchConfig()
配置文件实时加载实操
package main
import (
"fmt"
"net/http"
"github.com/fsnotify/fsnotify"
"github.com/gin-gonic/gin"
"github.com/spf13/viper"
)
func main() {
// 设置默认值
viper.SetDefault("fileDir", "./")
// 读取配置文件
viper.SetConfigFile("./config.yaml") // 指定配置文件路径
viper.SetConfigName("config") // 配置文件名称(无扩展名)
viper.SetConfigType("yaml") // 如果配置文件的名称中没有扩展名,则需要配置此项
viper.AddConfigPath("/etc/appname/") // 查找配置文件所在的路径
viper.AddConfigPath("$HOME/.appname") // 多次调用以添加多个搜索路径
viper.AddConfigPath(".") // 还可以在工作目录中查找配置
err := viper.ReadInConfig() // 查找并读取配置文件
if err != nil { // 处理读取配置文件的错误
panic(fmt.Errorf("Fatal error config file: %s \n", err))
}
// 实时监控配置文件的变化 WatchConfig 开始监视配置文件的更改。
viper.WatchConfig()
// OnConfigChange设置配置文件更改时调用的事件处理程序。
// 当配置文件变化之后调用的一个回调函数
viper.OnConfigChange(func(e fsnotify.Event) {
fmt.Println("Config file changed:", e.Name)
})
r := gin.Default()
r.GET("/version", func(c *gin.Context) {
// GetString以字符串的形式返回与键相关的值。
c.String(http.StatusOK, viper.GetString("version"))
})
r.Run()
}
运行并访问:http://127.0.0.1:8080/version
Code/go/viper_demo via
标签:语言,err,string,配置文件,viper,Go,config,Viper
From: https://www.cnblogs.com/QiaoPengjun/p/17489207.html