复盘配置库viper框架
Viper是适用于Go应用程序的完整配置解决方案。它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式。
main函数基本配置如下
package main
import "vipertest/core"
func main() {
//core.InitYamlViper("./yaml.yaml")
//core.InitTomlViper("./toml.toml")
//core.InitJsonViper("./json.json")
core.InitIniViper("./ini.ini")
select {}
}
程序根目录创建几个格式的配置文件
ini格式
[database]
server=127.0.0.1
ports=8003,8004,8007
[servers.alpha]
ip=127.0.0.1
json格式
{
"database": {
"server": "127.0.0.1",
"ports": [8003, 8004, 8007]
},
"servers": {
"alpha": {
"ip": "127.0.0.1"
}
}
}
yaml格式
database:
server: 127.0.0.1
ports:
- 8003
- 8004
- 8007
servers:
alpha:
ip: 127.0.0.1
toml格式
[database]
server = "127.0.0.1"
ports = [ 8004, 8005, 8006 ]
[servers]
[servers.alpha]
ip = "127.0.0.1"
核心代码如下
package core
import (
"fmt"
"github.com/fsnotify/fsnotify"
"github.com/spf13/viper"
)
type DatabaseConfig struct {
Server string `mapstructure:"server" json:"server" yaml:"server"`
Ports []int `mapstructure:"ports" json:"ports" yaml:"ports"`
}
type ServersConfig struct {
Alpha ServerInfo `mapstructure:"alpha" json:"alpha" yaml:"alpha"`
}
type ServerInfo struct {
IP string `mapstructure:"ip" json:"ip" yaml:"ip"`
}
type Ini struct {
Database DatabaseConfig `json:"database" ini:"database"`
Servers ServersConfig `json:"servers" ini:"servers"`
}
var IniConf Ini
type Json struct {
Database DatabaseConfig `json:"database"`
Servers ServersConfig `json:"servers"`
}
var JsonConf Json
type Toml struct {
Database DatabaseConfig `toml:"database"`
Servers ServersConfig `toml:"servers"`
}
var TomlConf Toml
type Yaml struct {
Database DatabaseConfig `yaml:"database"`
Servers ServersConfig `yaml:"servers"`
}
var YamlConf Yaml
// InitYamlViper 解析yaml格式文件
func InitYamlViper(path string) {
v := viper.New()
// 指定配置文件路径
v.SetConfigFile(path)
// 如果配置文件的名称中没有扩展名,则需要配置此项
v.SetConfigType("yaml")
// 查找并读取配置文件
err := v.ReadInConfig()
if err != nil {
fmt.Printf("读取配置文件错误: %s \n", err)
}
// 监控并重新读取配置文件
v.WatchConfig()
v.OnConfigChange(func(e fsnotify.Event) {
fmt.Println("配置文件内容已更改:", e.Name)
fmt.Println("all settings: ", v.AllSettings())
fmt.Println("database.server: ", v.GetString("database.server"))
fmt.Println("database.ports: ", v.GetIntSlice("database.ports"))
fmt.Println("--------------")
fmt.Println("servers.alpha.ip: ", v.GetString("servers.alpha.ip"))
if err = v.Unmarshal(&YamlConf); err != nil {
fmt.Printf("重新解析配置文件失败: %s \n", err)
}
fmt.Printf("新配置为:%#v\n", YamlConf)
fmt.Printf("新配置database.ports: %#v\n", YamlConf.Database.Ports)
})
fmt.Println("all settings: ", v.AllSettings())
fmt.Println("database.server: ", v.GetString("database.server"))
fmt.Println("database.ports: ", v.GetIntSlice("database.ports"))
fmt.Println("--------------")
fmt.Println("servers.alpha.ip: ", v.GetString("servers.alpha.ip"))
if err = v.Unmarshal(&YamlConf); err != nil {
fmt.Printf("解析配置文件失败: %s \n", err)
}
fmt.Printf("配置为:%#v\n", YamlConf)
fmt.Printf("database.ports: %#v\n", YamlConf.Database.Ports)
}
// InitTomlViper 解析toml格式文件
func InitTomlViper(path string) {
v := viper.New()
// 指定配置文件路径
v.SetConfigFile(path)
// 如果配置文件的名称中没有扩展名,则需要配置此项
v.SetConfigType("toml")
// 查找并读取配置文件
err := v.ReadInConfig()
if err != nil {
fmt.Printf("读取配置文件错误: %s \n", err)
}
// 监控并重新读取配置文件
v.WatchConfig()
v.OnConfigChange(func(e fsnotify.Event) {
fmt.Println("配置文件内容已更改:", e.Name)
fmt.Println("all settings: ", v.AllSettings())
fmt.Println("database.server: ", v.GetString("database.server"))
fmt.Println("database.ports: ", v.GetIntSlice("database.ports"))
fmt.Println("--------------")
fmt.Println("servers.alpha.ip: ", v.GetString("servers.alpha.ip"))
if err = v.Unmarshal(&TomlConf); err != nil {
fmt.Printf("重新解析配置文件失败: %s \n", err)
}
fmt.Printf("新配置为:%#v\n", TomlConf)
fmt.Printf("新配置database.ports: %#v\n", TomlConf.Database.Ports)
})
fmt.Println("all settings: ", v.AllSettings())
fmt.Println("database.server: ", v.GetString("database.server"))
fmt.Println("database.ports: ", v.GetIntSlice("database.ports"))
fmt.Println("--------------")
fmt.Println("servers.alpha.ip: ", v.GetString("servers.alpha.ip"))
if err = v.Unmarshal(&TomlConf); err != nil {
fmt.Printf("解析配置文件失败: %s \n", err)
}
fmt.Printf("配置为:%#v\n", TomlConf)
fmt.Printf("database.ports: %#v\n", TomlConf.Database.Ports)
}
// InitJsonViper 解析json格式文件
func InitJsonViper(path string) {
v := viper.New()
// 指定配置文件路径
v.SetConfigFile(path)
// 如果配置文件的名称中没有扩展名,则需要配置此项
v.SetConfigType("json")
// 查找并读取配置文件
err := v.ReadInConfig()
if err != nil {
fmt.Printf("读取配置文件错误: %s \n", err)
}
// 监控并重新读取配置文件
v.WatchConfig()
v.OnConfigChange(func(e fsnotify.Event) {
fmt.Println("配置文件内容已更改:", e.Name)
fmt.Println("all settings: ", v.AllSettings())
fmt.Println("database.server: ", v.GetString("database.server"))
fmt.Println("database.ports: ", v.GetIntSlice("database.ports"))
fmt.Println("--------------")
fmt.Println("servers.alpha.ip: ", v.GetString("servers.alpha.ip"))
if err = v.Unmarshal(&JsonConf); err != nil {
fmt.Printf("重新解析配置文件失败: %s \n", err)
}
fmt.Printf("新配置为:%#v\n", JsonConf)
fmt.Printf("新配置database.ports: %#v\n", JsonConf.Database.Ports)
})
fmt.Println("all settings: ", v.AllSettings())
fmt.Println("database.server: ", v.GetString("database.server"))
fmt.Println("database.ports: ", v.GetIntSlice("database.ports"))
fmt.Println("--------------")
fmt.Println("servers.alpha.ip: ", v.GetString("servers.alpha.ip"))
if err = v.Unmarshal(&JsonConf); err != nil {
fmt.Printf("解析配置文件失败: %s \n", err)
}
fmt.Printf("配置为:%#v\n", JsonConf)
fmt.Printf("database.ports: %#v\n", JsonConf.Database.Ports)
}
// InitIniViper 解析ini格式文件
func InitIniViper(path string) {
v := viper.New()
// 指定配置文件路径
v.SetConfigFile(path)
// 如果配置文件的名称中没有扩展名,则需要配置此项
v.SetConfigType("ini")
// 查找并读取配置文件
err := v.ReadInConfig()
if err != nil {
fmt.Printf("读取配置文件错误: %s \n", err)
}
// 监控并重新读取配置文件
v.WatchConfig()
v.OnConfigChange(func(e fsnotify.Event) {
fmt.Println("配置文件内容已更改:", e.Name)
fmt.Println("all settings: ", v.AllSettings())
fmt.Println("database.server: ", v.GetString("database.server"))
fmt.Println("database.ports: ", v.GetStringSlice("database.ports"))
fmt.Println("--------------")
fmt.Println("servers.alpha.ip: ", v.GetString("servers.alpha.ip"))
if err = v.Unmarshal(&IniConf); err != nil {
fmt.Printf("重新解析配置文件失败: %s \n", err)
}
fmt.Printf("新配置为:%#v\n", IniConf)
fmt.Printf("新配置database.ports: %#v\n", IniConf.Database.Ports)
})
fmt.Println("all settings: ", v.AllSettings())
fmt.Println("database.server: ", v.GetString("database.server"))
fmt.Println("database.ports: ", v.GetStringSlice("database.ports"))
fmt.Println("--------------")
fmt.Println("servers.alpha.ip: ", v.GetString("servers.alpha.ip"))
if err = v.Unmarshal(&IniConf); err != nil {
fmt.Printf("解析配置文件失败: %s \n", err)
}
fmt.Printf("配置为:%#v\n", IniConf)
fmt.Printf("database.ports: %#v\n", IniConf.Database.Ports)
}
共有 0 条评论