问题
我正在用 Go 构建一个 REST API。godotenv包用于加载环境变量。运行go run main.go
,项目按预期运行API,加载环境变量。
但是,当想要使用以下方式运行测试时:go test ./...
- 其中运行config/config_test.go
- 它会引发以下错误:(Error loading .env file
如函数中指定的那样)。
给定以下项目结构:
> app
> auth
> config
- config.go
- config_test.go
> migrations
> static
> vendor
- .env
- .gitignore
- docker-compose.yml
- go.mod
- go.sum
- main.go
- README.md
在config.go中,我使用以下函数来加载数据库配置。
func GetConfig() *Config {
err := godotenv.Load(".env")
if err != nil {
log.Fatalf("Error loading .env file")
}
dbHost := os.Getenv("DB_HOST")
dbPort := os.Getenv("DB_PORT")
dbName := os.Getenv("DB_DATABASE")
dbUsername := os.Getenv("DB_USERNAME")
dbPassword := os.Getenv("DB_PASSWORD")
return &Config{
DB: &DBConfig{
Connection: "mysql",
Host: dbHost,
Port: dbPort,
Username: dbUsername,
Password: dbPassword,
Name: dbName,
Charset: "utf8",
},
}
}
我知道它在从 root 运行时可以工作,因为它.env
位于 root 中。运行时config/config_test.go
,它会尝试.env
在/config/.env
. 如果我将 line: 更改err := godotenv.Load(".env")
为err := godotenv.Load("../.env")
,则 config_test.go 运行成功,但go run main.go
from root 运行不成功。
问题
如何.env
从GetConfig()
函数中动态加载位置config.go
,以便go test ./...
和go run main.go
都可以加载.env
?
编辑
我知道将path string
参数传递给GetConfig()
函数将在我的应用程序中工作(我正在应用程序包中初始化此配置)。但是,我想在不同的目录中创建多个测试,并且不希望传递参数。还有另一种方法可以做到这一点吗?