【摘要】
viper是一個簡單好用的讀取配置文件的第三方開源庫,它支持多種類型配置的讀寫,包括json、yml、環境變量、命令行等,使用該庫可以免去一些繁瑣的配置讀取代碼實現。
一 基本原理
當viper被調用來獲取參數時,它的基本執行邏輯如下:
1.通過自己的內部實現,獲取指定對象(配置文件,環境變量等)的內容
2.將獲取的內容解析,得到鍵值對集合,並將其存入自身的storage中
3.等待ReadInConfig,或GetInt等方法取值
從上面描述可知,無論viper獲取參數的來源是什么,最終的參數集合都是viper內部存放的鍵值對集合,也就可以使用viper.Get等方法獲取,這種方案的好處就是,當配置來源發生變化時,只需要修改viper的來源解析代碼,而不需要對已經嵌入業務代碼的參數讀寫邏輯做任何修改。
二 使用方法
首先,通過命令go get github.com/spf13/viper 獲取viper包
2.1 讀取配置文件:
通過指定目錄和文件名、文件類型,即可實現對指定文件的配置讀取:
viper.SetConfigName("config") // 文件名 viper.AddConfigPath("/etc/appname/") // 文件路徑 viper.AddConfigPath("$HOME/.appname") //可以使用多個文件路徑 err := viper.ReadInConfig() // 將配置讀入viper中存儲 err != nil { // Handle errors reading the config file panic(fmt.Errorf("Fatal error config file: %s \n", err)) } ... //viper.GetString(...)
2.2 讀取配置流:
viper.SetConfigType("yaml") // 設置配置的格式類型 var yamlExample = []byte(...) //...中為yml格式的字符串 viper.ReadConfig(bytes.NewBuffer(yamlExample)) //viper.ReadConfig()可以傳入任//何實現io.Reader接口的對象 viper.Get("name") // 使用Get獲取剛才讀取的結果
2.3 設置參數默認值:
viper.SetDefault("ContentDir", "content") viper.SetDefault("LayoutDir", "layouts") viper.SetDefault("Taxonomies", map[string]string{"tag": "tags", "category": "categories"})
2.4 監聽配置文件的讀寫事件:
配置監聽事件后,當文件出現讀寫操作,就會觸發事件,調用其聲明好的方法,該步驟通常用於處理配置文件的重載,有時也額外用於文件監控功能
viper.WatchConfig() //啟動監聽 viper.OnConfigChange(func(e fsnotify.Event) { //注冊文件監控的回調函數 fmt.Println("Config file changed:", e.Name) })
2.5 配置參數別名:
配置參數別名后,使用viper.Get方法時,傳入原本的key或者傳入別名都可以獲取指定參數的值,通常用於美化/簡化配置文件的參數格式
viper.RegisterAlias("base", "別名") //注冊別名
viper.Set("base", true)
viper.GetBool("base") //結果: true
viper.GetBool("別名") //結果: true
2.6 設置/覆蓋參數值:
手動覆蓋參數,此處不多贅述
viper.Set("base", true)
2.7 獲取命令行參數
viper的命令行參數獲取實際上是通過綁定flag對象實現的,使用方法相對其他幾種配置來源稍微復雜一點
package main import ( "flag" "github.com/spf13/pflag" ) func main() { // 使用基礎的flag包 flag.Int("flagname", 1234, "help message for flagname") //將flag轉換為pflag pflag.CommandLine.AddGoFlagSet(flag.CommandLine) pflag.Parse() //通過bind,將命令行參數綁定到viper的內部鍵值對集合中 viper.BindPFlags(pflag.CommandLine) i := viper.GetInt("flagname") // 此處已可以獲取參數
---------------------
原文來自【學領未來】,轉載時請保留原文鏈接。
鏈接:http://bbs.learnfuture.com/topic/6900
