gin config

编辑于 2022-09-08 22:55:46 阅读 1202

这里我选择json文件作为项目的配置文件

{
  "app_name": "app",
  "app_model": "debug",
  "app_host": "aa.com",
  "app_port": "8097",
  "database": {
    "dsn": "root:@tcp(docker-mysql:3306)/test?charset=utf8&parseTime=True&loc=Local&timeout=10ms"
  },
  "redis_config": {
    "host": "docker-redis",
    "port": ":6379",
    "password": "",
    "db": 0
  },
  "smtp_config": {
    "host": "smtp.mxhichina.com",
    "port": ":465",
    "ssl_port": ":25",
    "username": "notifications-noreply@aaaa.com",
    "password": "111111",
    "ssl": true
  },
  "file_config": {
    "prefix": "data/upload/",
    "avatar": "avatar/[admin_id].[ext]",
    "photo": "[date].[ext]",
    "editor": "editor/[date][ext]"
  }
}

config.go

...
func ParseConfig(path string)(*Config, error)  {
	file, err := os.Open(path)
	defer file.Close()
 
	if err != nil {
		panic(err)
	}
	reader := bufio.NewReader(file)
	decoder := json.NewDecoder(reader)
	if  err = decoder.Decode(&cfg); err != nil{
		return nil, err
	}
	return cfg, nil
}

使用的时候大概是这样

//main.go
config.ParseConfig("app/config/app.json")

//其他文件中
config.GetConfig().RedisConfig.Host

发现问题

在调试模式,上面的代码没有问题,当你要部署的时候发现找不到app/config/app.json文件了,因为go build只会打包go文件,json文件没打包

解决问题

Go 在1.16版解决了静态文件嵌入的问题 —— 加入了go embed

下面看下如何使用go embed解决上面的问题

config.go

package config

import (
	"embed"
	_ "embed"
	"encoding/json"
	"github.com/gin-gonic/gin"
)

//go:embed app.json
//go:embed app-dev.json
var f embed.FS

type Config struct {
	AppName     string         `json:"app_name"`
	AppModel    string         `json:"app_model"`
	AppHost     string         `json:"app_host"`
	AppPort     string         `json:"app_port"`
	Database    DatabaseConfig `json:"database"`
	RedisConfig RedisConfig    `json:"redis_config"`
	SMTPConfig  SMTPConfig     `json:"smtp_config"`
	FileConfig  FileConfig     `json:"file_config"`
}

type DatabaseConfig struct {
	DSN string `json:"dsn"`
}

type RedisConfig struct {
	Host     string `json:"host"`
	Port     string `json:"port"`
	Password string `json:"password"`
	Db       int    `json:"db"`
}

type SMTPConfig struct {
	Host     string `json:"host"`
	Port     string `json:"port"`
	SSLPort  string `json:"ssl_port"`
	Username string `json:"username"`
	Password string `json:"password"`
	SSL      bool   `json:"ssl"`
}

type FileConfig struct {
	Prefix string `json:"prefix"`
	Avatar string `json:"avatar"`
	Photo  string `json:"photo"`
	Editor string `json:"editor"`
}

func GetConfig() *Config {
	return cfg
}

var cfg *Config = nil

func ParseConfig() (*Config, error) {
	configPath := "app-dev.json"
	if gin.Mode() == gin.ReleaseMode {
		configPath = "app.json"
	}
	data, _ := f.ReadFile(configPath)
	err := json.Unmarshal(data, &cfg)
	if err != nil {
		return nil, err
	}
	return cfg, nil
}

参考

https://blog.csdn.net/Batac_Lee/article/details/109625932

https://github.red/go-embed/

https://colobu.com/2021/01/17/go-embed-tutorial/

广而告之,我的新作品《语音助手》上架Google Play了,欢迎下载体验