Viper 是一个完整的 Go 应用程序配置解决方案,它旨在在应用程序中工作,并且可以处理所有类型的配置需求和格式
使用viper并不复杂,在不生成实例的情况下,viper使用默认的实例才缓存配置信息,如果你不想这么做,可以使用viper.New()方法来生成自己的实例,直接上代码
package main
import (
"bytes"
"fmt"
"github.com/spf13/viper"
)
func main() {
viper.SetDefault("ContentDir", "content")
viper.SetDefault("LayoutDir", "layouts")
viper.SetDefault("Taxonomies", map[string]string{"tag": "tags", "category": "categories"})
/**
viper.SetDefault会设置默认参数,也就是说,每次读取文件后,这些参数都会读取到viper的缓存中,
并且在使用viper提供的方法写文件时,也会一同写进去,当使用Set方法后,默认值将会被覆盖
**/
viper.SetConfigName("config") // 这里设置要读取文件的名称
viper.SetConfigType("yaml") // 这里设置要读取文件的类型
viper.AddConfigPath(".") // 这里设置读取文件的文件夹路径,可以设置多个路径,将会依次从这几个路径中去寻找config.yaml文件
viper.AddConfigPath("./test3") // 设置的第二个备选路径
viper.AddConfigPath("./test") // 设置的最后一个备选路径
err := viper.ReadInConfig() // ReadInConfig用于读取查找到的配置文件
if err != nil {
panic(fmt.Errorf("fatal error config file: %w", err)) // 返回失败信息,可能由于文件不存在等
}
viper.Set("newconf", true) // 设置新参数,上面讲述了Set和SetDefault的区别,这里不再赘述
viper.WriteConfig()
viper.SafeWriteConfig()
viper.WriteConfigAs("./test2/config.yaml")
viper.SafeWriteConfigAs("./test2/config.yaml")
/**
WriteConfig用于将配置信息写入新的配置文件中,新文件的名称和后缀采用使用第20,21行所设置的SetConfigName("config")
和viper.SetConfigType("yaml")。WriteConfigAs可以指定新的配置文件的路径(带有文件名的路径),
而WriteConfig则写入你所定义的第一个AddConfigPath,即第22行:“ viper.AddConfigPath(".") ”
方法名带有Safe的则代表如果文件已经存在,则会报错。不带有Safe的方法在文件已经存在时会覆盖文件。
这里将会把第11,12,13行和第31行设置的参数连同config.yaml文件原本的参数一同写入到新文件中
**/
var yamlExample = []byte(`
Hacker: true
name: steve
hobbies:
- skateboarding
- snowboarding
- go
clothing:
jacket: leather
trousers: denim
age: 35
eyes : brown
beard: true
`)
viper.SetConfigType("yaml")
viper.ReadConfig(bytes.NewBuffer(yamlExample))
x := viper.GetString("name")
y := viper.Get("name")
fmt.Println(x)
fmt.Println(y)
/**
除了从文件中读取配置信息以外,也可以从字节流中读取,如上所示,GetString方法返回key所对应的字符串类型的value,
同样你也可以使用GetInt,GetBool等等,Get方法返回一个接口,因此它可以适用于所有的类型。
**/
viper.RegisterAlias("loud", "Verbose")
viper.Set("verbose", true)
viper.Set("loud", true)
viper.GetBool("loud")
viper.GetBool("verbose")
/**
RegisterAlias用于注册别名,也就意味着你接下来的所有关于loud的操作都可以用vervose来代替,
但他只作为你程序运行过程中一个方便使用的别名,其所表达的配置信息中不含有verbose这一属性,
也就是说最终你写入新配置文件时,verbose将不会出现
最后注意!!!:在vaper中,配置信息的key是不区分大小写的,因此上方的Verbose和verbose等同
**/
viper.AutomaticEnv()
// 读取环境变量
viper.SetEnvPrefix("CGO")
/** 设置环境变量前缀:CGO_,如果是cgo,将自动转变为大写。
这样在使用get读取环境变量时可以只读取与项目有关的配置
**/
viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_", "-", "_"))
// 将viper.Get(key) key字符串中'.'和'-'替换为'_',
// 这使得使用Get获取值的时候可以使用其他符号来代替_
viper.BindEnv("ENABLED") // 将"CGO_ENABLED"绑定到"ENABLED"
viper.BindEnv("enabled") // 匹配环境变量时自动转换为大写,但key仍然是小写
viper.BindEnv("user.secret-id", "GOROOT") // 当含有两个参数时,前缀不会生效
viper.BindEnv("PATH", "PATH")
fmt.Println(viper.Get("user.secret-id"))
fmt.Println(viper.GetString("ENABLED"))
fmt.Println(viper.GetString("enabled"))
fmt.Println(viper.GetString("PATH"))
// viper在读取环境变量时是区分大小写的
}