这是我参与「第五届青训营 」伴学笔记创作活动的第 16 天
Day16
Viper
Viper写入配置文件
-
WriteConfig
将当前的viper配置写到预定义的路径中,如果存在的话。如果没有预定义的路径,则会出现错误。如果当前的配置文件存在,将会覆盖它。
-
SafeWriteConfig
将当前的viper配置写到预定义的路径中。如果没有预定义的路径就会出错。不会覆盖当前的配置文件,如果它存在的话。
-
WriteConfigAs
将当前的配置写入给定的文件路径。将覆盖给定的文件,如果它存在的话。
-
SafeWriteConfigAs
将当前的viper配置写入给定的文件路径。将不会覆盖给定的文件,如果它存在的话。
作为一个经验法则,所有标有safe的东西都不会覆盖任何文件,而只是在不存在的情况下创建,而默认行为是创建或截断。
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实例观看配置。你可以选择提供一个函数,让Viper在每次发生变化时运行。
确保你在调用WatchConfig()之前添加所有的configPaths。
viper.OnConfigChange(func(e fsnotify.Event) {
fmt.Println("Config file changed:", e.Name)
})
viper.WatchConfig()
从io.Reader读取配置
Viper预先定义了许多配置源,如文件、环境变量、标志和远程K/V存储,但你并不受它们的约束。你也可以实现你自己所需的配置源,并将其反馈给viper。
viper.SetConfigType("yaml") // or viper.SetConfigType("YAML")
// any approach to require this configuration into your program.
var yamlExample = []byte(`
Hacker: true
name: steve
hobbies:
- skateboarding
- snowboarding
- go
clothing:
jacket: leather
trousers: denim
age: 35
eyes : brown
beard: true
`)
viper.ReadConfig(bytes.NewBuffer(yamlExample))
viper.Get("name") // this would be "steve"
设置重写
这些可能来自于一个命令行标志,或来自于你自己的应用逻辑。
viper.Set("Verbose", true)
viper.Set("LogFile", LogFile)
注册和使用别名
别名允许一个值被多个键所引用。
viper.RegisterAlias("loud", "Verbose")
viper.Set("verbose", true) // same result as next line
viper.Set("loud", true) // same result as prior line
viper.GetBool("loud") // true
viper.GetBool("verbose") // true
单例多例
在开始使用Viper时,不需要任何配置或初始化。由于大多数应用程序都希望使用一个单一的中央存储库进行配置,因此viper包提供了类似单例的功能。 你也可以创建许多不同的vipers在你的应用程序中使用。每一个都会有自己独特的配置和值的集合。每一个都可以从不同的配置文件、键值存储等读取。viper包所支持的所有功能都被镜像为viper上的方法。
x := viper.New()
y := viper.New()
x.SetDefault("ContentDir", "content")
y.SetDefault("ContentDir", "foobar")
// 当与多个viper打交道时,要由用户来跟踪不同的viper。
//...