增加 cli / env / file 配置解析

This commit is contained in:
白茶清欢 2024-11-05 18:20:20 +08:00
parent 8cf014ac0a
commit 07fbbbdc11
4 changed files with 57 additions and 28 deletions

View File

@ -1,26 +0,0 @@
// Package config ...
//
// Description : config ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2024-11-05 16:26
package config
// DefaultConfig 默认配置文件路径配置
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 16:27 2024/11/5
//
// 默认配置文件路径配置, 配置文件路径及类型也可通过命令行参数指定. 支持属性如下:
// - config-type(dct) : 配置文件类型 ini / json / yml / yaml / toml , 默认值:空字符串,会根据传入配置文件后缀自行判断
// - config-path(dcp) : 配置文件路径, 传入绝对路径,则使用绝对路径读取,传入相对路径,则自动在服务运行的根目录下进行文件查找
// - parse-sort(dps) : 默认值 : cli,env,param 配置文件解析的优先级,分隔 , 排在前面的优先级高
// - env-file(def) : 默认值 : .env 环境变量文件路径, 传入绝对路径,则使用绝对路径读取,传入相对路径,则自动在服务运行的根目录下进行文件查找
type DefaultConfig struct {
ConfigType string `short:"dct" long:"config-type" default:"" json:"config_type" ini:"config_type" yaml:"config_type" toml:"config_type" description:"配置文件类型 : ini / json / yml / yaml / toml , 默认值:空字符串,会根据传入配置文件后缀自行判断"`
ConfigPath string `short:"dcp" long:"config-path" default:"" json:"config_path" ini:"config_path" yaml:"config_path" toml:"config_path" description:"配置文件路径, 传入绝对路径,则使用绝对路径读取,传入相对路径,则自动在服务运行的根目录下进行文件查找"`
ParseSort string `short:"dps" long:"parse-sort" default:"cli,env,param" json:"parse_sort" ini:"parse_sort" yaml:"parse_sort" toml:"parse_sort" description:"参数解析优先级,支持 : cli/env/file"`
EnvFile string `short:"def" long:"env-file" default:".env" json:"env_file" ini:"env_file" yaml:"env_file" toml:"env_file" description:"环境变量文件路径, 传入绝对路径,则使用绝对路径读取,传入相对路径,则自动在服务运行的根目录下进行文件查找"`
}

8
go.mod
View File

@ -3,6 +3,14 @@ module git.zhangdeman.cn/zhangdeman/config
go 1.23.2 go 1.23.2
require ( require (
git.zhangdeman.cn/zhangdeman/consts v0.0.0-20241104082108-0f97a870bbc3 // indirect
git.zhangdeman.cn/zhangdeman/serialize v0.0.0-20241104092308-ecb02113459e // indirect
git.zhangdeman.cn/zhangdeman/util v0.0.0-20240618042405-6ee2c904644e // indirect
github.com/BurntSushi/toml v1.4.0 // indirect
github.com/caarlos0/env/v9 v9.0.0 // indirect
github.com/go-ini/ini v1.67.0 // indirect
github.com/jessevdk/go-flags v1.6.1 // indirect github.com/jessevdk/go-flags v1.6.1 // indirect
github.com/joho/godotenv v1.5.1 // indirect
golang.org/x/sys v0.26.0 // indirect golang.org/x/sys v0.26.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
) )

17
go.sum
View File

@ -1,4 +1,21 @@
git.zhangdeman.cn/zhangdeman/consts v0.0.0-20241104082108-0f97a870bbc3 h1:BiAlBJ+DuRs/xD7nDQD2JT8Oc+V+0Uwt36qZwdXGvzI=
git.zhangdeman.cn/zhangdeman/consts v0.0.0-20241104082108-0f97a870bbc3/go.mod h1:IXXaZkb7vGzGnGM5RRWrASAuwrVSNxuoe0DmeXx5g6k=
git.zhangdeman.cn/zhangdeman/serialize v0.0.0-20241104092308-ecb02113459e h1:A045F67AMSqFKGD9kk2uLa+6c/zpmW8vjjSRmSsdjPs=
git.zhangdeman.cn/zhangdeman/serialize v0.0.0-20241104092308-ecb02113459e/go.mod h1:XqgER4jDYwskFgj2riJ9XptIjzgYWubY+Zq8iB2WkY0=
git.zhangdeman.cn/zhangdeman/util v0.0.0-20240618042405-6ee2c904644e h1:Q973S6CcWr1ICZhFI1STFOJ+KUImCl2BaIXm6YppBqI=
git.zhangdeman.cn/zhangdeman/util v0.0.0-20240618042405-6ee2c904644e/go.mod h1:VpPjBlwz8U+OxZuxzHQBv1aEEZ3pStH6bZvT21ADEbI=
github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0=
github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/caarlos0/env/v9 v9.0.0 h1:SI6JNsOA+y5gj9njpgybykATIylrRMklbs5ch6wO6pc=
github.com/caarlos0/env/v9 v9.0.0/go.mod h1:ye5mlCVMYh6tZ+vCgrs/B95sj88cg5Tlnc0XIzgZ020=
github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A=
github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
github.com/jessevdk/go-flags v1.6.1 h1:Cvu5U8UGrLay1rZfv/zP7iLpSHGUZ/Ou68T0iX1bBK4= github.com/jessevdk/go-flags v1.6.1 h1:Cvu5U8UGrLay1rZfv/zP7iLpSHGUZ/Ou68T0iX1bBK4=
github.com/jessevdk/go-flags v1.6.1/go.mod h1:Mk8T1hIAWpOiJiHa9rJASDK2UGWji0EuPGBnNLMooyc= github.com/jessevdk/go-flags v1.6.1/go.mod h1:Mk8T1hIAWpOiJiHa9rJASDK2UGWji0EuPGBnNLMooyc=
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

34
init.go
View File

@ -9,7 +9,10 @@ package config
import ( import (
"errors" "errors"
"git.zhangdeman.cn/zhangdeman/serialize"
envParse "github.com/caarlos0/env/v9"
"github.com/jessevdk/go-flags" "github.com/jessevdk/go-flags"
"github.com/joho/godotenv"
"reflect" "reflect"
) )
@ -18,16 +21,43 @@ import (
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 16:25 2024/11/5 // Date : 16:25 2024/11/5
func Init(configReceiver any) error { //
// 参数:
// - configReceiver 接收参数结果的指针
// - envFileList 环境变量文件路径, 可以指定多个环境变量文件, 不指定默认加载服务运行目录下 .env 文件
// - configFile 配置文件路径
func Init(configReceiver any, envFileList []string, configFile string) error {
var ( var (
err error err error
) )
if nil == envFileList {
envFileList = make([]string, 0)
}
// 检查结构体指针是否合法
if err = checkConfigReceiver(configReceiver); err != nil { if err = checkConfigReceiver(configReceiver); err != nil {
return err return err
} }
if _, err = flags.Parse(configReceiver); nil != err { // 加载环境变量
if err = godotenv.Load(envFileList...); nil != err {
return err
}
// 解析命令行参数
cliReceiver := cloneReceiver(configReceiver)
if _, err = flags.Parse(cliReceiver); nil != err {
return err
}
// 解析环境变量参数
envReceiver := cloneReceiver(configReceiver)
if err = envParse.Parse(envReceiver); nil != err {
return err
}
// 解析配置文件参数
fileReceiver := cloneReceiver(configReceiver)
if err = serialize.File.ReadAnyFileContent(configFile, fileReceiver); nil != err {
return err return err
} }
return nil return nil