使用godotenv加载.env文件时,非绝对路径加载失败求解决方案
排查思路
检查程序运行的工作目录
相对路径是基于程序启动时的工作目录,而非代码文件所在目录。可以在init函数开头添加代码打印当前工作目录确认:import "os" func init() { wd, err := os.Getwd() if err != nil { panic(err) } println("当前工作目录:", wd) // 后续加载.env的代码 }比如你在
/home/peter目录下执行go run Documents/tests/configuration/config.go,工作目录是/home/peter,而非代码所在的/home/peter/Documents/tests/configuration,自然找不到.env文件。规范go run/go build的执行位置
使用go run时,先切换到.env所在目录再执行命令:cd /home/peter/Documents/tests/configuration go run config.go若编译成二进制文件,运行时需确保工作目录是
.env所在目录,或把.env放到二进制文件的运行目录下。调整IDE的运行配置(若用IDE开发)
多数IDE默认以项目根目录作为运行工作目录,而非代码文件所在的子目录。需要在IDE的运行配置中,将工作目录修改为.env所在的configuration目录。用代码动态构造.env路径
若需要从任意目录运行程序,可通过代码获取当前文件的路径,再拼接.env的绝对路径:import "path/filepath" import "runtime" func init() { _, filename, _, ok := runtime.Caller(0) if !ok { panic("无法获取当前文件路径") } dir := filepath.Dir(filename) envPath := filepath.Join(dir, ".env") err := godotenv.Load(envPath) if err != nil { panic(err) } Config = GetConfig() }这种方式能确保无论从哪个目录运行,都能找到代码同目录下的
.env文件。验证文件本身的合法性
用ls -b .env查看文件名称是否包含隐藏特殊字符(如空格、不可见字符);用ls -l .env检查文件权限,确保程序拥有读取该文件的权限(至少要有读权限r)。
内容的提问来源于stack exchange,提问作者pigfox
相关产品推荐
相关产品推荐

