refactor: 解决无法正确加载 .env 的问题
This commit is contained in:
@@ -3,6 +3,8 @@ package config
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/gin-contrib/cors"
|
"github.com/gin-contrib/cors"
|
||||||
@@ -48,13 +50,30 @@ type Config struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func Load() (*Config, error) {
|
func Load() (*Config, error) {
|
||||||
var err error
|
// 查找go.mod所在的模块根目录
|
||||||
err = godotenv.Load("../configs/.env")
|
_, filename, _, ok := runtime.Caller(0)
|
||||||
err = godotenv.Load("./configs/.env")
|
if !ok {
|
||||||
if err != nil {
|
return nil, fmt.Errorf("unable to get caller info")
|
||||||
return nil, fmt.Errorf("error loading .env file: %w", err)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dir := filepath.Dir(filename)
|
||||||
|
for {
|
||||||
|
if _, err := os.Stat(filepath.Join(dir, "go.mod")); err == nil {
|
||||||
|
// 找到模块根目录,加载configs/.env
|
||||||
|
envPath := filepath.Join(dir, "configs", ".env")
|
||||||
|
if err = godotenv.Load(envPath); err == nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
parent := filepath.Dir(dir)
|
||||||
|
if parent == dir {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
dir = parent
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果找不到.env,继续使用环境变量
|
||||||
|
|
||||||
cfg := &Config{
|
cfg := &Config{
|
||||||
Server: ServerConfig{
|
Server: ServerConfig{
|
||||||
Port: getEnv("PORT", "3001"),
|
Port: getEnv("PORT", "3001"),
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
package config
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestLoad(t *testing.T) {
|
||||||
|
cfg, err := Load()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Load() failed: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if cfg.Server.Port == "" {
|
||||||
|
t.Error("Expected Server.Port to have default value")
|
||||||
|
}
|
||||||
|
|
||||||
|
if cfg.LLM.Provider == "" && cfg.LLM.APIKey == "" {
|
||||||
|
t.Logf("Config loaded - some optional values may be empty (expected if .env not found)")
|
||||||
|
} else {
|
||||||
|
t.Logf("Config loaded successfully. Provider: %s, Model: %s",
|
||||||
|
cfg.LLM.Provider, cfg.LLM.Model)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user