Golang项目的配置管理——Viper简易入门配置
What is Viper?
Why Viper?
Install
go get github.com/spf13/viper
Example
初始化:
package settings
import (
"fmt"
"github.com/fsnotify/fsnotify"
"github.com/spf13/viper"
)
//初始化一个viper配置
func Init() (err error) {
//制定组态档的路径
viper.SetConfigFile("conf/config.yaml")
// 读取配置信息
err = viper.ReadInConfig()
if err != nil {
// 读取配置信息失败
fmt.Printf("viper.ReadInConfig()failed,err:%v\n", err)
return
}
//监听修改
viper.WatchConfig()
//为配置修改增加一个回呼函式
viper.OnConfigChange(func(in fsnotify.Event) {
fmt.Println("组态档修改了...")
})
return
}
组态档示例(yaml):
mysql:
host: "127.0.0.1"
port: 3306
user: "root"
password: "123456"
dbname: "web_app"
max_open_conns: 200
max_idle_conns: 50
redis:
host: "127.0.0.1"
port: 6379
db: 0
password: ""
pool_size: 100
取配置:
package mysql
//省略package
func Init() (err error) {
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True",
viper.GetString("mysql.user"),
viper.GetString("mysql.password"),
viper.GetString("mysql.host"),
viper.GetInt("mysql.port"),
viper.GetString("mysql.dbname"),
)
db, err = sqlx.Connect("mysql", dsn)
db.SetMaxOpenConns(viper.GetInt("mysql.max_open_conns"))
db.SetMaxIdleConns(viper.GetInt("mysql.max_idle_conns"))
return
}
// @version 1.0
程序内显示宣告配置:
如果某个键通过viper.Set
设定了值,那么这个值的优先级最高,如:
viper.Set("redis.port", 9000)
此时redis的界面就不是组态档中设定的6379,而是后面配置的9000
命令列选项:
func init() {
pflag.Int("redis.port", 9001, "Redis port to connect")
// 系结命令列
viper.BindPFlags(pflag.CommandLine)
}
代码运行时传入自变量:$ ./main.exe --redis.port 9001
此时程序配置的redis埠为:9001,
如果我们不传入自变量直接执行$ ./main.exe
此时程序配置的redis埠为组态档中的6379(没有在程序中显示宣告配置时viper.Set("redis.port", 9000)
),
环境变量:
func init() {
// 系结环境变量
viper.AutomaticEnv()
}
在没有于前面的方法中取得配置的情况下,则会系结环境变量,
也可以指定系结对应的环境变量:
func init() {
// 系结环境变量
viper.BindEnv("redis.port")
viper.BindEnv("go.path", "GOPATH")
}
BindEnv()
如果只传入一个自变量,则这个自变量既表示键名,又表示环境变量名,如果传入两个自变量,则第一个自变量表示键名,第二个自变量表示环境变量名,
也可以通过viper.SetEnvPrefix()
设定环境变量前缀,设定后前面的方法会为传入的值加上变量后再去查找环境变量,
- 默认值可以呼叫
viper.SetDefault
设定,
总结优先级:
呼叫Set
显式设定的>命令列选项传入的>环境变量>组态档>默认值;
总结
初始化:
- 设定组态档路径
viper.SetConfigFile()
- 读取配置
viper.ReadInConfig()
- 监听修改
viper.WatchConfig()
- 设定修改后回呼
viper.OnConfigChange(func())
呼叫:
? 取配置viper.Get*()
设定优先级:
宣告呼叫Set
显式设定的>命令列选项传入的>环境变量>组态档>默认值;
我的个人站:mrxuexi.com
0 评论