ошибка open .env: no such file or directory после go build, go install

после сборки и установки выходит ошибка отсутствия .env, файл в проекте есть, заполнен верно.

func NewPool() (*pgxpool.Pool, error) {
    err := godotenv.Load()
    if err != nil {
        fmt.Println(err.Error())
        os.Exit(1)
    }
    connStr := fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=disable",
        os.Getenv("DB_HOST_IP"),
        os.Getenv("DB_PORT"),
        os.Getenv("DB_USER"),
        os.Getenv("DB_PASSWORD"),
        os.Getenv("DB_NAME"),
    )

    dbPool, err := pgxpool.New(context.Background(), connStr)
    if err != nil {
        return nil, fmt.Errorf("unable to create connection pool: %v\n", err)
    }
    if err := dbPool.Ping(context.Background()); err != nil {
        dbPool.Close()
        return nil, fmt.Errorf("unable to ping database: %v\n", err)
    }
    log.Println("db connection pool created successfully")
    return dbPool, nil
}

нашел такой вариант второй строки кода, таким образом все заработало

err := godotenv.Load("/Users/{user}/GolandProjects/cli_notes/.env")

можно ли сделать так, чтобы не было необходимости указывать абсолютный путь?


Ответы (1 шт):

Автор решения: Osardio

Не понятна цель вашей задачи. Вы хотите загрузить .env файл из уже собранного бинарника?

Но в таком случае, теряется смысл переменных среды. Они нужны как раз таки для того, чтобы пользователь приложения мог подключить его к своей БД, а не к той, которую вы задали.

Файл .env предназначен для того, чтобы запускать приложение в локальном окружении, а не в продакшене. Он не должен поставляться вместе с бинарником. Ваша попытка запустить приложение с "вшитым" в бинарник .env не имеет смысла. Если вы хотите использовать эти данные для подключения к БД в продуктиве по умолчанию, тогда лучше просто захардкодить эти значения - вместо os.Getenv("DB_HOST_IP") просто впишите IP.

Выходит, что у вас несколько вариантов решения: либо вы вписываете креды прямо в код, либо используете свои креды по умолчанию если нет переменных среды, либо заставляете пользователя использовать переменные среды, предотвращая запуск приложения, если нужные env не обнаружены.

→ Ссылка