package core import ( "flag" "fmt" "github.com/gin-gonic/gin" "log" "os" "srm/core/internal" "github.com/fsnotify/fsnotify" "github.com/spf13/viper" "srm/global" ) // Viper // // 优先级: 命令行 > 环境变量 > 默认值 // Author [SliverHorn](https://github.com/SliverHorn) func Viper(path ...string) *viper.Viper { var config string if len(path) == 0 { flag.StringVar(&config, "c", "", "choose config file.") flag.Parse() if config == "" { // 判断命令行参数是否为空 if configEnv := os.Getenv(internal.ConfigEnv); configEnv == "" { // 判断 internal.ConfigEnv 常量存储的环境变量是否为空 switch gin.Mode() { case gin.DebugMode: config = internal.ConfigDefaultFile fmt.Printf("您正在使用gin模式的%s环境名称,config的路径为%s\n", gin.EnvGinMode, internal.ConfigDefaultFile) case gin.ReleaseMode: config = internal.ConfigReleaseFile fmt.Printf("您正在使用gin模式的%s环境名称,config的路径为%s\n", gin.EnvGinMode, internal.ConfigReleaseFile) case gin.TestMode: config = internal.ConfigTestFile fmt.Printf("您正在使用gin模式的%s环境名称,config的路径为%s\n", gin.EnvGinMode, internal.ConfigTestFile) } } else { // internal.ConfigEnv 常量存储的环境变量不为空 将值赋值于config config = configEnv fmt.Printf("您正在使用%s环境变量,config的路径为%s\n", internal.ConfigEnv, config) } } else { // 命令行参数不为空 将值赋值于config fmt.Printf("您正在使用命令行的-c参数传递的值,config的路径为%s\n", config) } } else { // 函数传递的可变参数的第一个值赋值于config config = path[0] fmt.Printf("您正在使用func Viper()传递的值,config的路径为%s\n", config) } v := viper.New() v.SetConfigFile(config) v.SetConfigType("yaml") err := v.ReadInConfig() if err != nil { panic(fmt.Errorf("Fatal error config file: %s \n", err)) } v.WatchConfig() v.OnConfigChange(func(e fsnotify.Event) { fmt.Println("config file changed:", e.Name) if err = v.Unmarshal(&global.GVA_CONFIG); err != nil { fmt.Println(err) } }) if err = v.Unmarshal(&global.GVA_CONFIG); err != nil { fmt.Println(err) } ConfigFromEnv() return v } func ConfigFromEnv() { DBHost := os.Getenv("DB_HOST") DBName := os.Getenv("DB_NAME") DBPort := os.Getenv("DB_PORT") DBUser := os.Getenv("DB_USER") DBPasswd := os.Getenv("DB_PASSWD") if len(DBHost) > 0 && len(DBName) > 0 && len(DBPort) > 0 && len(DBUser) > 0 && len(DBPasswd) > 0 { global.GVA_CONFIG.Mysql.Path = DBHost global.GVA_CONFIG.Mysql.Port = DBPort global.GVA_CONFIG.Mysql.Dbname = DBName global.GVA_CONFIG.Mysql.Username = DBUser global.GVA_CONFIG.Mysql.Password = DBPasswd } log.Printf("mysql dsn:%v", global.GVA_CONFIG.Mysql.Dsn()) grpcPort := os.Getenv("GRPC_PORT") if grpcPort != "" { global.GVA_CONFIG.System.GrpcPort = grpcPort } apsGrpc := os.Getenv("APS_GRPC") if apsGrpc != "" { global.GVA_CONFIG.System.GrpcUrl = apsGrpc } wmsGrpc := os.Getenv("WMS_GRPC") if wmsGrpc != "" { global.GVA_CONFIG.System.GrpcWmsUrl = wmsGrpc } adminGrpc := os.Getenv("ADMIN_GRPC") if adminGrpc != "" { global.GVA_CONFIG.System.GrpcAdminUrl = adminGrpc } log.Printf(" System: %+v", global.GVA_CONFIG.System) }