From:https://github.com/spf13/viper
創(chuàng)新互聯(lián)建站主營博望網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,app軟件定制開發(fā),博望h5小程序制作搭建,博望網(wǎng)站營銷推廣歡迎博望等地區(qū)企業(yè)咨詢
Viper is a complete configuration solution for Go applications including 12-Factor apps.
(VIPER是實(shí)現(xiàn)遵循12-Factor的GO應(yīng)用程序的完整配置解決方案)
它支持:
支持 JSON/TOML/YAML/HCL/envfile/Java properties 等多種格式的配置文件
實(shí)時(shí)監(jiān)控及重載配置文件(可選)
從環(huán)境變量、命令行標(biāo)記、緩存中讀取配置;
從遠(yuǎn)程配置系統(tǒng)中讀取和監(jiān)聽修改,如 etcd/Consul;
顯式設(shè)置鍵值。
When building a modern application, you don’t want to worry about configuration file formats; you want to focus on building awesome software. Viper is here to help with that.
(構(gòu)建現(xiàn)代應(yīng)用程序時(shí),你不想去過多關(guān)注配置文件的格式,你想專注于建立更棒的軟件,Viper可以幫助你)
go get github.com/spf13/viper
package settings
import (
"fmt"
"github.com/fsnotify/fsnotify"
"github.com/spf13/viper"
)
//初始化一個(gè)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
}
//監(jiān)聽修改
viper.WatchConfig()
//為配置修改增加一個(gè)回調(diào)函數(shù)
viper.OnConfigChange(func(in fsnotify.Event) {
fmt.Println("配置文件修改了...")
})
return
}
mysql:
host: "127.0.0.1"
port: 3306
user: "root"
password: ""
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
如果某個(gè)鍵通過viper.Set
設(shè)置了值,那么這個(gè)值的優(yōu)先級(jí)最高。如:
viper.Set("redis.port", 9000)
此時(shí)redis的接口就不是配置文件中設(shè)置的6379,而是后面配置的9000
func init() {
pflag.Int("redis.port", 9001, "Redis port to connect")
// 綁定命令行
viper.BindPFlags(pflag.CommandLine)
}
代碼運(yùn)行時(shí)傳入?yún)?shù):$ ./main.exe --redis.port 9001
此時(shí)程序配置的redis端口為:9001。
如果我們不傳入?yún)?shù)直接執(zhí)行$ ./main.exe
此時(shí)程序配置的redis端口為配置文件中的6379(沒有在程序中顯示聲明配置時(shí)viper.Set("redis.port", 9000)
)。
func init() {
// 綁定環(huán)境變量
viper.AutomaticEnv()
}
在沒有于前面的方法中取得配置的情況下,則會(huì)綁定環(huán)境變量。
也可以指定綁定對(duì)應(yīng)的環(huán)境變量:
func init() {
// 綁定環(huán)境變量
viper.BindEnv("redis.port")
viper.BindEnv("go.path", "GOPATH")
}
BindEnv()
如果只傳入一個(gè)參數(shù),則這個(gè)參數(shù)既表示鍵名,又表示環(huán)境變量名。如果傳入兩個(gè)參數(shù),則第一個(gè)參數(shù)表示鍵名,第二個(gè)參數(shù)表示環(huán)境變量名。
也可以通過viper.SetEnvPrefix()
設(shè)置環(huán)境變量前綴,設(shè)置后前面的方法會(huì)為傳入的值加上變量后再去查找環(huán)境變量。
viper.SetDefault
設(shè)置。調(diào)用Set
顯式設(shè)置的>命令行選項(xiàng)傳入的>環(huán)境變量>配置文件>默認(rèn)值;
viper.SetConfigFile()
viper.ReadInConfig()
viper.WatchConfig()
viper.OnConfigChange(func())
? 取配置viper.Get*()
聲明調(diào)用Set
顯式設(shè)置的>命令行選項(xiàng)傳入的>環(huán)境變量>配置文件>默認(rèn)值;
我的個(gè)人站:mrxuexi.com