diff --git a/define.go b/define.go deleted file mode 100644 index e8edd5e..0000000 --- a/define.go +++ /dev/null @@ -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:"环境变量文件路径, 传入绝对路径,则使用绝对路径读取,传入相对路径,则自动在服务运行的根目录下进行文件查找"` -} diff --git a/go.mod b/go.mod index 1125407..3fbd9c1 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,14 @@ module git.zhangdeman.cn/zhangdeman/config go 1.23.2 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/joho/godotenv v1.5.1 // indirect golang.org/x/sys v0.26.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index b903a32..817ddcb 100644 --- a/go.sum +++ b/go.sum @@ -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/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/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= diff --git a/init.go b/init.go index 2f7c270..b2a3717 100644 --- a/init.go +++ b/init.go @@ -9,7 +9,10 @@ package config import ( "errors" + "git.zhangdeman.cn/zhangdeman/serialize" + envParse "github.com/caarlos0/env/v9" "github.com/jessevdk/go-flags" + "github.com/joho/godotenv" "reflect" ) @@ -18,16 +21,43 @@ import ( // Author : go_developer@163.com<白茶清欢> // // 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 ( err error ) + if nil == envFileList { + envFileList = make([]string, 0) + } + + // 检查结构体指针是否合法 if err = checkConfigReceiver(configReceiver); err != nil { 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 nil