首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对godotenv.Load() .env文件使用动态位置?

如何对godotenv.Load() .env文件使用动态位置?
EN

Stack Overflow用户
提问于 2021-07-12 11:15:43
回答 1查看 6.1K关注 0票数 6

问题

我正在Go中构建一个REST。godotenv封装用于加载环境变量。运行go run main.go,项目将按预期运行API,加载环境变量。

但是,当希望使用:go test ./...运行config/config_test.go等测试时,它会引发以下错误:Error loading .env file (如函数中所指定的)。

给出了以下项目结构:

代码语言:javascript
复制
> 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中,我使用以下函数加载数据库配置。

代码语言:javascript
复制
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",
        },
    }
}

我理解它在从根运行时工作,因为.env驻留在根中。当运行config/config_test.go时,它尝试在/config/.env中查找.env文件。如果我将行:err := godotenv.Load(".env")更改为err := godotenv.Load("../.env"),则config_test.go成功运行,而根用户的go run main.go未成功运行。

问题

如何从.env中的GetConfig()函数动态加载config.go位置,以便go test ./...go run main.go都可以加载.env

编辑

我知道,将path string参数传递给GetConfig()函数在我的应用程序中是有效的(我正在应用程序包中初始化这个配置)。但是,我希望在不同的目录中创建多个测试,并且不希望传递参数。还有别的方法可以做到这一点吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-12 13:02:02

按照@ tab的建议,我实现了以下解决方案,该解决方案也列在godotenv封装godotenv封装选项卡上。

config.go中,我为目录名添加了一个常量(在我的例子中是rest-api )。我添加了一个loadEnv函数,它尝试根据项目名称和当前工作目录动态获取项目的根路径。

代码语言:javascript
复制
const projectDirName = "rest-api" // change to relevant project name

func loadEnv() {
    projectName := regexp.MustCompile(`^(.*` + projectDirName + `)`)
    currentWorkDirectory, _ := os.Getwd()
    rootPath := projectName.Find([]byte(currentWorkDirectory))

    err := godotenv.Load(string(rootPath) + `/.env`)

    if err != nil {
        log.Fatalf("Error loading .env file")
    }
}

func GetConfig() *Config {
    loadEnv()

    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",
        },
    }
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68346410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档