ошибка 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 шт):
Не понятна цель вашей задачи. Вы хотите загрузить .env
файл из уже собранного бинарника?
Но в таком случае, теряется смысл переменных среды. Они нужны как раз таки для того, чтобы пользователь приложения мог подключить его к своей БД, а не к той, которую вы задали.
Файл .env
предназначен для того, чтобы запускать приложение в локальном окружении, а не в продакшене. Он не должен поставляться вместе с бинарником. Ваша попытка запустить приложение с "вшитым" в бинарник .env
не имеет смысла. Если вы хотите использовать эти данные для подключения к БД в продуктиве по умолчанию, тогда лучше просто захардкодить эти значения - вместо os.Getenv("DB_HOST_IP")
просто впишите IP.
Выходит, что у вас несколько вариантов решения: либо вы вписываете креды прямо в код, либо используете свои креды по умолчанию если нет переменных среды, либо заставляете пользователя использовать переменные среды, предотвращая запуск приложения, если нужные env не обнаружены.