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
}