package conf import ( "gls/lib/gls-server-core/core/core_conf" "log" "os" "path/filepath" "strings" "github.com/mitchellh/mapstructure" "github.com/spf13/pflag" "github.com/spf13/viper" ) // json转go网址: // https://www.bejson.com/transfor/json2go/ // YAML 转 GO: www.printlove.cn/tools/yaml2go // JSON 转 GO: www.printlove.cn/tools/json2go // JSON 转 YAML: http://www.json2yaml.com/ type ServerConfig struct { Server struct { Listen string `json:"Listen" yaml:"Listen"` Name string `json:"Name" yaml:"Name"` } `json:"Server" yaml:"Server"` } type GLSConfig struct { Sname string `json:"Sname" yaml:"Sname"` Logger core_conf.LogConfig `json:"Logger" yaml:"Logger"` PPFL ServerConfig `json:"PPFL" yaml:"PPFL"` DG5 ServerConfig `json:"DG5" yaml:"DG5"` PPTTH ServerConfig `json:"PPTTH" yaml:"PPTTH"` PPGOO ServerConfig `json:"PPGOO" yaml:"PPGOO"` PPGOO1000 ServerConfig `json:"PPGOO1000" yaml:"PPGOO1000"` PPPYBO ServerConfig `json:"PPPYBO" yaml:"PPPYBO"` PPSR ServerConfig `json:"PPSR" yaml:"PPSR"` PPSR1000 ServerConfig `json:"PPSR1000" yaml:"PPSR1000"` PPSP ServerConfig `json:"PPSP" yaml:"PPSP"` PPSB ServerConfig `json:"PPSB" yaml:"PPSB"` PPSBX ServerConfig `json:"PPSBX" yaml:"PPSBX"` PPWWGM ServerConfig `json:"PPWWGM" yaml:"PPWWGM"` PPTDHM ServerConfig `json:"PPTDHM" yaml:"PPTDHM"` PPPF ServerConfig `json:"PPPF" yaml:"PPPF"` PPZVH ServerConfig `json:"PPZVH" yaml:"PPZVH"` } var Config GLSConfig func InitYAML() { InitConfig() } func InitConfig() { Config = GLSConfig{} scf := "server.yml" if len(os.Args) > 1 { scf = os.Args[1] } LoadConfig(scf, "config", &Config) } func LoadConfig(cfgName string, cmdName string, target any) { rootDir, _ := os.Getwd() cfgDefPath := filepath.Join(rootDir, "../../conf", cfgName) cmd := pflag.NewFlagSet(os.Args[0], pflag.ExitOnError) cmd.String(cmdName, cfgDefPath, "config file") args := os.Args[1:] for i, s := range args { if strings.HasSuffix(s, cmdName) { args = args[i:(i + 2)] break } } cmd.Parse(args) v := viper.New() v.BindPFlags(cmd) cfgFileName := v.GetString(cmdName) cfgFilePath := cfgFileName if cfgFileName != cfgDefPath { cfgFilePath = filepath.Join(rootDir, "../../conf", cfgFileName) } v.SetConfigType("yml") v.SetConfigFile(cfgFilePath) if err := v.ReadInConfig(); err != nil { log.Fatal("read config error", err) panic(err) } if err := v.Unmarshal(target, func(decoderConfig *mapstructure.DecoderConfig) { decoderConfig.WeaklyTypedInput = true }); err != nil { panic(err) } } // TODO 临时改的 func LoadConfigNew(cfgName string, cmdName string, target any) { rootDir, _ := os.Getwd() cfgDefPath := filepath.Join(rootDir, "conf", cfgName) cmd := pflag.NewFlagSet(os.Args[0], pflag.ExitOnError) cmd.String(cmdName, cfgDefPath, "config file") args := os.Args[1:] for i, s := range args { if strings.HasSuffix(s, cmdName) { args = args[i:(i + 2)] break } } cmd.Parse(args) v := viper.New() v.BindPFlags(cmd) cfgFileName := v.GetString(cmdName) cfgFilePath := cfgFileName if cfgFileName != cfgDefPath { cfgFilePath = filepath.Join(rootDir, "conf", cfgFileName) } v.SetConfigType("yml") v.SetConfigFile(cfgFilePath) if err := v.ReadInConfig(); err != nil { log.Fatal("read config error", err) panic(err) } if err := v.Unmarshal(target, func(decoderConfig *mapstructure.DecoderConfig) { decoderConfig.WeaklyTypedInput = true }); err != nil { panic(err) } }