Go语言配置管理神器---- viper中文教程

1 Viper 是适用于 Go 应用程序的完整配置解决方案。它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式。

 

2 安装

go get github.com/spf13/viper

 

3 了解 Viper

  viper 被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式。它支持以下特性:

  1.  设置默认值
  2.    从 JSON 、TOML、 YAML、HCL、envfile 、properties 、ini格式的配置文件读取配置信息
  3.    实时监控和重新读取配置文件(可选)
  4.    从环境变量中读取
  5.    从远程配置系统(etcd 或 consul)并监控配置变化
  6.    从命令行参数读取配置
  7.    从 buffer 读取配置
  8.    显示配置值

 

4 能做啥

  1、查找、加载和反序列 JSON 、TOML、 YAML、HCL、envfile 、properties 、ini 格式的配置文件

  2、提供一种机制为你的不同配置选项设置默认值

  3、提供别名系统,以便在不破坏现有代码的情况下轻松重命名参数。

  4、当用户提供了与默认值相同的命令行或配置文件时,可以很容易地分辨出它们之间的区别。

 

 

5 优先级

  1. 显示调用 Set 设置值
  2. 命令行参数 flag
  3. 环境变量
  4. 配置文件
  5. key/value 存储
  6. 默认值

 

6 目前Viper配置的键(Key)是大小写不敏感的

 

 

7 、将值存入到 Viper

  1、建立默认值

  如果没有通过配置文件、环境变量、远程配置或命令行标志(flag)设置键,则默认值是非常有用的。  

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

 

  2、读取配置文件

  Viper不默认任何配置搜索路径,将默认决策留给应用程序。

func TestSetDefault(t *testing.T) {
// 设置默认值
viper.SetDefault("fileDir", "./")
// 读取配置文件
// 1、配置文件是 config.ymal
viper.SetConfigName("config") // 配置文件名称(无扩展名)
viper.SetConfigType("yaml") // 如果配置文件的名称中没有扩展名,则需要配置此项
// 等价于 viper.SetConfigFile("config.yaml")

// 2、配置文件的路径
viper.AddConfigPath("/etc/appname/") // 查找配置文件所在的路径 ,找到所有的 config.yaml
viper.AddConfigPath("$HOME/.appname") // 多次调用以添加多个搜索路径 , 找到所有的 config.yaml
viper.AddConfigPath("./") // 还可以在工作目录中查找配置 , 找到所有的 config.yaml

err := viper.ReadInConfig() // 查找并读取配置文件
if err != nil { // 处理读取配置文件的错误
panic(fmt.Errorf("Fatal error config file: %s \n", err))
}
}
在加载配置文件出错时,你可以像下面这样处理找不到配置文件的特定情况:
if err := viper.ReadInConfig(); err != nil {
    if _, ok := err.(viper.ConfigFileNotFoundError); ok {
        // 配置文件未找到错误;如果需要可以忽略
    } else {
        // 配置文件被找到,但产生了另外的错误
    }
}

// 配置文件找到并成功解析

 

  3、写配置文件

    从配置文件中读取配置文件是有用的,但是有时你想要存储在运行时所做的所有修改。为此,可以使用下面一组命令,每个命令都有自己的用途:

  1.  WriteConfig - 将当前的viper配置写入预定义的路径并覆盖(如果存在的话)。如果没有预定义的路径,则报错。
  2.  SafeWriteConfig - 将当前的viper配置写入预定义的路径。如果没有预定义的路径,则报错。如果存在,将不会覆盖当前的配置文件。
  3.  WriteConfigAs - 将当前的viper配置写入给定的文件路径。将覆盖给定的文件(如果它存在的话)。
  4. SafeWriteConfigAs - 将当前的viper配置写入给定的文件路径。不会覆盖给定的文件(如果它存在的话)。

  根据经验,标记为safe的所有方法都不会覆盖任何文件,而是直接创建(如果不存在),而默认行为是创建或截断。

viper.WriteConfig() // 将当前配置写入“viper.AddConfigPath()”和“viper.SetConfigName”设置的预定义路径
viper.SafeWriteConfig()
viper.WriteConfigAs("/path/to/my/.config")
viper.SafeWriteConfigAs("/path/to/my/.config") // 因为该配置文件写入过,所以会报错
viper.SafeWriteConfigAs("/path/to/my/.other_config")

 

  4、监控并重新读取配置文件

  Viper支持在运行时实时读取配置文件的功能。

  需要重新启动服务器以使配置生效的日子已经一去不复返了,viper驱动的应用程序可以在运行时读取配置文件的更新,而不会错过任何消息。

  只需告诉viper实例watchConfig。可选地,你可以为Viper提供一个回调函数,以便在每次发生更改时运行。

  确保在调用WatchConfig()之前添加了所有的配置路径。

  

  

  验证

    r := gin.Default()
    r.GET("/v", func(c *gin.Context) {
        fmt.Println("进来了")
        c.String(http.StatusOK, viper.GetString("aaa"))
    })
    r.Run()

// 改变config.yaml 的值,程序不用重启,两次打印的值不一样

 

   5、覆盖设置

这些可能来自命令行标志,也可能来自你自己的应用程序逻辑。

viper.Set("Verbose", true)
viper.Set("LogFile", LogFile)

  省略了很多

 

从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{}

需要认识到的一件重要事情是,每一个Get方法在找不到值的时候都会返回零值。为了检查给定的键是否存在,提供了IsSet()方法。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

  

 

posted @ 2022-08-21 23:10  dogRuning  阅读(1092)  评论(0编辑  收藏  举报