goweb项目将配置文件打包进可执行文件,并用viper读取

先上代码
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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。