优化配置文件解析 + 合并
This commit is contained in:
parent
50c54a9340
commit
6ad8734375
118
init.go
118
init.go
@ -9,43 +9,13 @@ package config
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
|
||||||
"git.zhangdeman.cn/zhangdeman/serialize"
|
"git.zhangdeman.cn/zhangdeman/serialize"
|
||||||
|
"github.com/caarlos0/env/v9"
|
||||||
"github.com/jessevdk/go-flags"
|
"github.com/jessevdk/go-flags"
|
||||||
"github.com/joho/godotenv"
|
"github.com/joho/godotenv"
|
||||||
"github.com/spf13/viper"
|
"path/filepath"
|
||||||
"reflect"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// InitByViper 通过viper库初始化配置
|
|
||||||
//
|
|
||||||
// Author : go_developer@163.com<白茶清欢>
|
|
||||||
//
|
|
||||||
// Date : 18:44 2024/11/7
|
|
||||||
//
|
|
||||||
// 配置解析优先级 : 显示的值设置 > 命令行标记 > 环境变量 > 配置文件 > 键值存储 > 默认值
|
|
||||||
//
|
|
||||||
// 参数:
|
|
||||||
// - configReceiver 接收参数结果的指针
|
|
||||||
// - envFileList 环境变量文件路径, 可以指定多个环境变量文件, 不指定默认加载服务运行目录下 .env 文件
|
|
||||||
// - configFilePath 配置文件目录
|
|
||||||
// - configFileNameList 要加载的配置文件列表
|
|
||||||
func InitByViper(configReceiver any, envFileList []string, configFilePath string, configFileNameList []string) error {
|
|
||||||
viper.AddConfigPath(configFilePath)
|
|
||||||
for _, configFileName := range configFileNameList {
|
|
||||||
viper.SetConfigName(configFileName)
|
|
||||||
}
|
|
||||||
// 解析配置
|
|
||||||
if err := viper.ReadInConfig(); nil != err {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
// 获取全部配置,并解析
|
|
||||||
if err := serialize.JSON.Transition(viper.AllSettings(), configReceiver); nil != err {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Init 初始化配置
|
// Init 初始化配置
|
||||||
//
|
//
|
||||||
// Author : go_developer@163.com<白茶清欢>
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
@ -53,72 +23,48 @@ func InitByViper(configReceiver any, envFileList []string, configFilePath string
|
|||||||
// Date : 16:25 2024/11/5
|
// Date : 16:25 2024/11/5
|
||||||
//
|
//
|
||||||
// 参数:
|
// 参数:
|
||||||
// - configReceiver 接收参数结果的指针
|
// - configReceiver 接收最终配置结果的指针
|
||||||
|
// - cliReceiver 命令函参数配置结果
|
||||||
|
// - envReceiver 环境变量配置结果
|
||||||
|
// - fileReceiver 文件配置结果
|
||||||
// - envFileList 环境变量文件路径, 可以指定多个环境变量文件, 不指定默认加载服务运行目录下 .env 文件
|
// - envFileList 环境变量文件路径, 可以指定多个环境变量文件, 不指定默认加载服务运行目录下 .env 文件
|
||||||
// - configFile 配置文件路径
|
// - configFilePath 配置文件目录
|
||||||
func Init(configReceiver any, envFileList []string, configFile string) error {
|
// - configFileNameList 配置文件列表
|
||||||
|
func Init(configReceiver any, cliReceiver any, envReceiver any, fileReceiver any, envFileList []string, configFilePath string, configFileNameList []string) error {
|
||||||
var (
|
var (
|
||||||
err error
|
err error
|
||||||
fileConfigMap = map[string]any{}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
if nil == envFileList {
|
if len(envFileList) == 0 {
|
||||||
envFileList = make([]string, 0)
|
envFileList = []string{".env"}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查结构体指针是否合法
|
if nil != envFileList {
|
||||||
if err = checkConfigReceiver(configReceiver); err != nil {
|
// 加载环境变量
|
||||||
return err
|
if err = godotenv.Load(envFileList...); nil != err {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err = env.Parse(envReceiver); nil != err {
|
||||||
|
return errors.New("env param parse fail : " + err.Error())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 加载环境变量
|
if nil != fileReceiver && len(configFileNameList) > 0 {
|
||||||
if err = godotenv.Load(envFileList...); nil != err {
|
// 读取配置文件内容
|
||||||
return err
|
for _, itemConfigFileName := range configFileNameList {
|
||||||
}
|
configFile := filepath.Join(configFilePath, itemConfigFileName)
|
||||||
|
if err = serialize.File.ReadAnyFileContent(configFile, &fileReceiver); nil != err {
|
||||||
|
return errors.New(configFile + " -> parse config file fail : " + err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
// 解析命令行参数
|
// 解析命令行参数
|
||||||
if _, err = flags.Parse(configReceiver); nil != err {
|
if _, err = flags.Parse(cliReceiver); nil != err {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
if err = serialize.JSON.MergeDataForReceiver(configReceiver, fileReceiver, envReceiver, configReceiver); nil != err {
|
||||||
// 读取配置文件内容
|
return errors.New("merge config data fail : " + err.Error())
|
||||||
if err = serialize.File.ReadAnyFileContent(configFile, &fileConfigMap); nil != err {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 解析配置文件参数
|
|
||||||
configTypeReflect := reflect.TypeOf(configReceiver).Elem()
|
|
||||||
configValueReflect := reflect.ValueOf(configReceiver).Elem()
|
|
||||||
configFieldNum := configValueReflect.NumField()
|
|
||||||
for i := 0; i < configFieldNum; i++ {
|
|
||||||
fmt.Println(configTypeReflect.Field(i).Name)
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// checkConfigReceiver 校验配置接收者必须是指针
|
|
||||||
//
|
|
||||||
// Author : go_developer@163.com<白茶清欢>
|
|
||||||
//
|
|
||||||
// Date : 17:16 2024/11/5
|
|
||||||
func checkConfigReceiver(configReceiver any) error {
|
|
||||||
if nil == configReceiver {
|
|
||||||
return errors.New("config receiver is nil")
|
|
||||||
}
|
|
||||||
receiverType := reflect.TypeOf(configReceiver)
|
|
||||||
if receiverType.Kind() != reflect.Ptr {
|
|
||||||
return errors.New("config receiver is not a pointer")
|
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// cloneReceiver ...
|
|
||||||
//
|
|
||||||
// Author : go_developer@163.com<白茶清欢>
|
|
||||||
//
|
|
||||||
// Date : 17:16 2024/11/5
|
|
||||||
func cloneReceiver(configReceiver any) any {
|
|
||||||
dataType := reflect.TypeOf(configReceiver).Elem()
|
|
||||||
return reflect.New(dataType).Interface()
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user