From 184081592c4e3a89a477bc1238070f9580b282f5 Mon Sep 17 00:00:00 2001 From: "lilong.129" Date: Mon, 2 Jun 2025 11:52:36 +0800 Subject: [PATCH] feat: add global .env file support from ~/.hrp/.env - Add support for loading environment variables from ~/.hrp/.env - Implement priority order: current working directory > ~/.hrp/.env > system environment variables - Use godotenv.Overload() for both global and local .env files to ensure proper priority - Maintain backward compatibility with existing functionality - Add comprehensive error handling and logging --- internal/config/env.go | 23 ++++++++++++++++++++++- internal/version/VERSION | 2 +- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/internal/config/env.go b/internal/config/env.go index a9b830d0..6ba572fb 100644 --- a/internal/config/env.go +++ b/internal/config/env.go @@ -15,8 +15,29 @@ var loadEnvOnce sync.Once // LoadEnv loads environment variables from .env file // it will search for .env file from current working directory upward recursively +// if not found, it will try to load from ~/.hrp/.env as fallback +// Priority: current working directory > ~/.hrp/.env > system environment variables func LoadEnv() (err error) { loadEnvOnce.Do(func() { + // first try to load from ~/.hrp/.env, override system env variables (medium priority) + var homeDir string + homeDir, err = os.UserHomeDir() + if err != nil { + log.Warn().Err(err).Msg("get user home directory failed") + } else { + globalEnvFile := filepath.Join(homeDir, ".hrp", ".env") + if _, e := os.Stat(globalEnvFile); e == nil { + // load global .env file and override system environment variables + err = godotenv.Overload(globalEnvFile) + if err != nil { + log.Error().Err(err). + Str("path", globalEnvFile).Msg("load global env file failed") + return + } + log.Info().Str("path", globalEnvFile).Msg("load global env success") + } + } + // get current working directory var cwd string cwd, err = os.Getwd() @@ -31,7 +52,7 @@ func LoadEnv() (err error) { envFile := filepath.Join(envPath, ".env") if _, e := os.Stat(envFile); e == nil { // found .env file - // override existing env variables + // override existing env variables (highest priority) err = godotenv.Overload(envFile) if err != nil { log.Error().Err(err). diff --git a/internal/version/VERSION b/internal/version/VERSION index b53cf300..adc20cc6 100644 --- a/internal/version/VERSION +++ b/internal/version/VERSION @@ -1 +1 @@ -v5.0.0-beta-2505310028 +v5.0.0-beta-2506021152