goweb項(xiàng)目將配置文件打包進(jìn)可執(zhí)行文件,并用viper讀取

先上代碼
viper讀取配置文件代碼

//viper讀取配置文件
func InitConfig()  {
    //獲得當(dāng)前的工作目錄
    workDir, _ := os.Getwd()
    //設(shè)置文件路徑
    viper.AddConfigPath(workDir + "/yml")
    //設(shè)置讀取的文件名
    viper.SetConfigName("application")
    //設(shè)置要讀取的文件類(lèi)型
    viper.SetConfigType("yml")
    //處理讀取文件時(shí)的錯(cuò)誤
    err := viper.ReadInConfig()
    if err != nil {
        panic(err)
    }
}

打包后viper讀取配置文件代碼

//viper讀取配置文件
func InitConfig()  {
    //從打包后的文件中讀取配置
    bytesContent, err := data.Asset("yml/application.yml")
    if err != nil {
        panic("Asset() can not found setting file")
    }
    //設(shè)置要讀取的文件類(lèi)型
    viper.SetConfigType("yml")
    //讀取
    viper.ReadConfig(bytes.NewBuffer(bytesContent))
}

一、安裝 go-bindata:

go get -u github.com/jteeuwen/go-bindata/...

注意 go get 地址最后的三個(gè)點(diǎn) ...。這樣會(huì)分析所有子目錄并下載依賴編譯子目錄內(nèi)容。go-bindata 的命令工具在子目錄中。(還要記得把 $GOPATH/bin 加入系統(tǒng) PATH)。

二、使用命令工具 go-bindata

go-bindata -o=data/data.go -pkg=data yml/...

-o 輸出文件到 data/data.go,包名 -pkg=data,然后是需要打包的目錄,為yml文件夾,三個(gè)點(diǎn)包括所有子目錄。這樣就可以把yml下所有相關(guān)文件打包到data.go。

三、實(shí)例

yml包下application文件

datasource:
  driverName: mysql
  host: localhost
  port: 3306
  database: security
  username: root
  password: 123456
  charset: utf8

main.go文件

package main

import (
    "bytes"
    _ "github.com/jinzhu/gorm/dialects/mysql"
    "github.com/spf13/viper"
    "log"
    "xyz.lande/dao"
    "xyz.lande/data"
    "xyz.lande/docs"
    "xyz.lande/router"
)

func main() {
    log.Println("app initializing")
    docs.SwaggerInfo.Title = "測(cè)試"
    docs.SwaggerInfo.Version = "v1.0"
    //讀取配置
    InitConfig()
    //獲取初始化后的數(shù)據(jù)庫(kù)
    db := dao.InitDB()
    //延遲關(guān)閉
    defer db.Close()
    //路由
    router.RunEcho()
}

//viper讀取配置文件
func InitConfig()  {
    //從打包后的文件中讀取配置
    bytesContent, err := data.Asset("yml/application.yml")
    if err != nil {
        panic("Asset() can not found setting file")
    }
    //設(shè)置要讀取的文件類(lèi)型
    viper.SetConfigType("yml")
    //讀取
    viper.ReadConfig(bytes.NewBuffer(bytesContent))
}

bytesContent, err := data.Asset("yml/application.yml")這段代碼就是一個(gè)使用 go-bindata 的例子,這里講 yml/application.yml通過(guò) go-bindata 封裝起來(lái),然后下面就直接使用它,這樣在運(yùn)行的時(shí)候我就不用關(guān)注靜態(tài)文件的具體位置了,我只認(rèn)準(zhǔn)yml/application.yml 就好了。

四、編譯運(yùn)行

go build main.go

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容