先上代码
viper读取配置文件代码
//viper读取配置文件
func InitConfig() {
//获得当前的工作目录
workDir, _ := os.Getwd()
//设置文件路径
viper.AddConfigPath(workDir + "/yml")
//设置读取的文件名
viper.SetConfigName("application")
//设置要读取的文件类型
viper.SetConfigType("yml")
//处理读取文件时的错误
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")
}
//设置要读取的文件类型
viper.SetConfigType("yml")
//读取
viper.ReadConfig(bytes.NewBuffer(bytesContent))
}
一、安装 go-bindata:
go get -u github.com/jteeuwen/go-bindata/...
注意 go get 地址最后的三个点 ...。这样会分析所有子目录并下载依赖编译子目录内容。go-bindata 的命令工具在子目录中。(还要记得把 $GOPATH/bin 加入系统 PATH)。
二、使用命令工具 go-bindata
go-bindata -o=data/data.go -pkg=data yml/...
-o 输出文件到 data/data.go,包名 -pkg=data,然后是需要打包的目录,为yml文件夹,三个点包括所有子目录。这样就可以把yml下所有相关文件打包到data.go。
三、实例
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 = "测试"
docs.SwaggerInfo.Version = "v1.0"
//读取配置
InitConfig()
//获取初始化后的数据库
db := dao.InitDB()
//延迟关闭
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")
}
//设置要读取的文件类型
viper.SetConfigType("yml")
//读取
viper.ReadConfig(bytes.NewBuffer(bytesContent))
}
bytesContent, err := data.Asset("yml/application.yml")这段代码就是一个使用 go-bindata 的例子,这里讲 yml/application.yml通过 go-bindata 封装起来,然后下面就直接使用它,这样在运行的时候我就不用关注静态文件的具体位置了,我只认准yml/application.yml 就好了。
四、编译运行
go build main.go