package conf import ( "fmt" "log" "os" "path/filepath" "strings" "time" "git.apinb.com/bsm-sdk/core/env" "git.apinb.com/bsm-sdk/core/print" "git.apinb.com/bsm-sdk/core/vars" "golang.org/x/exp/rand" yaml "gopkg.in/yaml.v3" ) func New(srvKey string, cfg any) *Runtime { var run Runtime // 设置服务键 vars.ServiceKey = srvKey // 获取主机名 vars.HostName, _ = os.Hostname() // 获取根目录路径,优先使用环境变量设置的路径,如果未设置则使用当前工作目录 rootDir := strings.ToLower(env.GetEnvDefault("CORE_Path", "")) if rootDir == "" { rootDir, _ = os.Getwd() } // 获取运行模式,如果环境变量未设置,则默认为"dev" run.Mode = strings.ToLower(env.GetEnvDefault("CORE_Mode", "dev")) // 获取JWT密钥,用于身份验证 run.JwtKey = strings.ToLower(env.GetEnvDefault("CORE_JwtKey", "")) // 获取许可证路径,如果环境变量未设置,则默认在根目录下的"etc"文件夹 run.LicencePath = strings.ToLower(env.GetEnvDefault("CORE_LicencePath", "")) if run.LicencePath == "" { run.LicencePath = filepath.Join(rootDir, "etc") } // 如果JWT密钥未设置,则记录错误并终止程序 if run.JwtKey == "" { log.Fatalf("ENV: CORE_JwtKey Not Nil !") } // 构造配置文件路径,输出配置文件信息 cfp := fmt.Sprintf("%s_%s.yaml", srvKey, run.Mode) cfp = filepath.Join(rootDir, "etc", cfp) print.Info("[CORE - %s] Config File: %s", srvKey, cfp) // 读取配置文件内容 yamlFile, err := os.ReadFile(cfp) if err != nil { log.Fatalf("ERROR: %v", err) } // 检查配置文件中是否存在Service和Addr字段 if !strings.Contains(string(yamlFile), "Service:") { log.Fatalln("ERROR: Service Not Nil", cfp) } if !strings.Contains(string(yamlFile), "Port:") { log.Fatalln("ERROR: Port Not Nil", cfp) } // 解析YAML err = yaml.Unmarshal(yamlFile, cfg) if err != nil { log.Fatalf("ERROR: %v", err) } return &run } func NotNil(values ...string) { for _, value := range values { if strings.TrimSpace(value) == "" { log.Fatalln("ERROR:Must config not nil") } } } func CheckPort(port int) int { if port <= 0 || port >= 65535 { rand.Seed(uint64(time.Now().UnixNano())) return rand.Intn(65535-1024) + 1024 // 生成1024到65535之间的随机端口 } return port }