82 lines
1.9 KiB
Go
82 lines
1.9 KiB
Go
package config
|
||
|
||
import (
|
||
"log"
|
||
"os"
|
||
"path/filepath"
|
||
"strings"
|
||
|
||
"github.com/joho/godotenv"
|
||
)
|
||
|
||
// LoadEnvFiles 从多个候选路径加载 .env(不覆盖已存在的 OS 环境变量)。
|
||
// 查找顺序:CWD → programDir → programDir/.. 。
|
||
func LoadEnvFiles() {
|
||
candidates := envFileCandidates()
|
||
loaded := false
|
||
for _, p := range candidates {
|
||
if _, err := os.Stat(p); err != nil {
|
||
continue
|
||
}
|
||
if err := godotenv.Load(p); err != nil {
|
||
log.Printf("config: 加载 %s 失败: %v", p, err)
|
||
continue
|
||
}
|
||
log.Printf("config: 已加载 %s", p)
|
||
loaded = true
|
||
}
|
||
if !loaded {
|
||
log.Print("config: 未找到 .env,请复制 .env.example 为 .env 并填写 XK_API_TOKEN、HY_*")
|
||
}
|
||
}
|
||
|
||
// WarnIfRequiredEnvMissing 在关键变量仍为空时提示检查 .env 路径与语法。
|
||
func WarnIfRequiredEnvMissing() {
|
||
var missing []string
|
||
for _, key := range []string{"XK_API_TOKEN", "HY_APP_KEY", "HY_APP_SECRET", "HY_AES_KEY"} {
|
||
if strings.TrimSpace(os.Getenv(key)) == "" {
|
||
missing = append(missing, key)
|
||
}
|
||
}
|
||
if len(missing) > 0 {
|
||
log.Printf("config: 以下变量仍为空: %s(请检查 .env 是否在项目根且语法正确,含引号)", strings.Join(missing, ", "))
|
||
}
|
||
}
|
||
|
||
func envFileCandidates() []string {
|
||
seen := make(map[string]struct{})
|
||
var out []string
|
||
add := func(p string) {
|
||
p = filepath.Clean(p)
|
||
if _, ok := seen[p]; ok {
|
||
return
|
||
}
|
||
seen[p] = struct{}{}
|
||
out = append(out, p)
|
||
}
|
||
|
||
if wd, err := os.Getwd(); err == nil && wd != "" {
|
||
add(filepath.Join(wd, ".env"))
|
||
}
|
||
base := programDir()
|
||
add(filepath.Join(base, ".env"))
|
||
add(filepath.Join(base, "..", ".env"))
|
||
return out
|
||
}
|
||
|
||
func programDir() string {
|
||
if exe, err := os.Executable(); err == nil {
|
||
dir := filepath.Dir(exe)
|
||
if strings.Contains(dir, "go-build") {
|
||
if wd, err := os.Getwd(); err == nil && wd != "" {
|
||
return wd
|
||
}
|
||
}
|
||
return dir
|
||
}
|
||
if wd, err := os.Getwd(); err == nil && wd != "" {
|
||
return wd
|
||
}
|
||
return "."
|
||
}
|