Как создать файл env go

Обновлено: 30.06.2024

Порт Go (golang) проекта Ruby dotenv (который загружает переменные env из файла .env)

Из исходной библиотеки:

Сохранение конфигурации в среде — один из принципов приложения с двенадцатью факторами. Все, что может измениться между средами развертывания, например дескрипторы ресурсов для баз данных или учетные данные для внешних служб, должно быть извлечено из кода в переменные среды.

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

Его можно использовать как библиотеку (для загрузки в env ваших собственных демонов и т. д.) или как команду bin.

Существует тестовое покрытие и CI как для Linux, так и для Windows, но я не даю никаких гарантий, что bin-версия будет работать в Windows.

или если вы хотите использовать его как команду корзины

Добавьте конфигурацию вашего приложения в файл .env в корне вашего проекта:

Затем в приложении Go вы можете сделать что-то вроде

Если вы еще ленивее, вы можете просто воспользоваться пакетом автозагрузки, который будет считываться в .env при импорте

Хотя .env в корне проекта используется по умолчанию, вас не нужно ограничивать, оба приведенных ниже примера на 100 % соответствуют действительности

Если вы хотите, чтобы ваш файл env был действительно необычным, вы можете делать комментарии и экспортировать (ниже приведен действительный файл env)

Или, наконец, вы можете использовать стиль YAML

И в заключение: если вы не хотите, чтобы godotenv портил вашу среду, вы можете просто вернуть карту

<р>. или из io.Reader вместо локального файла

<р>. или из строки, если хотите

Существующие окружения имеют приоритет над окружениями, загружаемыми позже.

Соглашение для управления несколькими средами (т. е. разработка, тестирование, производство) заключается в создании окружения с именем _ENV и загрузке окружений в следующем порядке:

Если вам нужно, вы также можете использовать godotenv.Overload(), чтобы бросить вызов этому соглашению и перезаписать существующие env, а не просто заменить их. Используйте с осторожностью.

Предполагая, что вы установили указанную выше команду и у вас есть $GOPATH/bin в $PATH

Если вы не укажете -f, будет использоваться по умолчанию загрузка .env в PWD

Запись файлов Env

Godotenv также может записать карту, представляющую окружающую среду, в правильно отформатированный и экранированный файл

Вклад приветствуется! Сам синтаксический анализатор довольно глупо наивен, и я не удивлюсь, если он сломается в пограничных случаях.

изменения кода без тестов не принимаются

  1. Разветвить
  2. Создайте ветку вашей функции ( git checkout -b my-new-feature )
  3. Зафиксируйте свои изменения ( git commit -am 'Добавлена ​​некоторая функция' )
  4. Отправить в ветку ( git push origin my-new-feature )
  5. Создать новый запрос на включение

Выпуски должны следовать за Semver, несмотря на то, что первая пара выпусков — v1 и v1.1.

Исходная библиотека dotenv была написана Брэндоном Киперсом, а этот порт был выполнен Джоном Бартоном на основе тестов/фикстур в исходной библиотеке.

О нас

Порт Go для Ruby-библиотеки dotenv (загружает переменные среды из `.env`.)

В учебнике по Go env показано, как работать с переменными среды в Golang.

Переменная среды

Переменная среды — это значение с динамическим именем, которое может влиять на поведение запущенных процессов на компьютере. Они являются частью среды, в которой выполняется процесс. При разработке программного обеспечения переменные среды используются для настройки приложений.

Примеры переменных среды включают расположение всех исполняемых файлов в файловой системе, оболочку и редактор по умолчанию или языковые настройки системы.

Для работы с переменными среды в Go мы можем использовать пакет os или сторонние библиотеки godotenv или viper.

Перейти к os.Getenv

Getenv извлекает значение переменной среды, названной по ключу. Он возвращает значение, которое будет пустым, если переменная отсутствует. Чтобы отличить пустое значение от неустановленного, используйте LookupEnv .

В примере выводится имя текущей пользовательской оболочки.

Перейти к os.LookupEnv

Функция LookupEnv извлекает значение переменной среды, названной по ключу. Если переменная установлена, значение (которое может быть пустым) возвращается, а логическое значение равно true. В противном случае возвращаемое значение будет пустым, а логическое значение будет ложным.

В примере кода мы пытаемся получить две переменные среды. Если переменная присутствует, печатается ее значение; в противном случае отображается сообщение о том, что переменная не установлена.

Перейти к os.Setenv

OS.Setenv устанавливает значение переменной среды, названной по ключу.

В примере кода мы устанавливаем переменную EDITOR с помощью os.Setenv .

Перейти к списку переменных среды

os.Environ возвращает копию строк, представляющих среду, в форме "ключ=значение".

В примере кода мы получаем список всех переменных среды. Мы разрезаем строки с помощью SplitN на пары ключ-значение.

Перейти к os.Expandenv

os.ExpandEnv — это вспомогательная функция, которая заменяет $var внутри строки значением заданной переменной. Ссылки на неопределенные переменные заменяются пустой строкой.

В примере раскрываются две переменные.

Перейти к библиотеке dotenv

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

Мы устанавливаем библиотеку.

У нас есть две переменные.

С помощью функции Load мы загружаем переменные, а затем извлекаем их с помощью os.Getenv .

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

В примере кода мы считываем переменные среды из файла .env в карту.

Переменные среды — это лучший способ задать значения конфигурации для вашего программного приложения, поскольку они могут быть определены на системном уровне, независимо от программного обеспечения. Это один из принципов методологии приложения с двенадцатью факторами, который позволяет создавать переносимые приложения.


Использование переменных среды

Все, что вам нужно для взаимодействия с переменными среды, — это стандартный пакет ОС. Вот
пример доступа к системной переменной среды PATH.

Также легко установить переменные среды:

Загрузка переменных среды из файла .env

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

godotenv — это порт Go библиотеки Ruby
dotenv. Это позволяет вам определять
переменные среды вашего приложения в файле .env.

Чтобы установить пакет, выполните:

Добавьте значения конфигурации в файл .env в корне вашего проекта:

Затем вы можете использовать эти значения в своем приложении:

Важно отметить, что если переменная среды уже определена в
системе, Go предпочтет использовать ее вместо значения в .env .

Включение переменных среды в пакет конфигурации

Прямой доступ к переменным среды — это хорошо, но необходимость поддерживать это не кажется забавной, не так ли? Каждое значение представляет собой строку — и представьте, что вам нужно обновлять каждую ссылку при изменении ключа среды!

Чтобы решить эту проблему, давайте создадим пакет конфигурации для доступа к переменным среды гораздо
более централизованным и удобным в сопровождении способом.

Вот простой пакет конфигурации, который возвращает значения конфигурации в структуре
Config. У нас есть возможность определить значение по умолчанию, поэтому, если
переменная среды не существует, вместо нее будет использоваться она.

Далее мы должны добавить различные типы в структуру Config. Текущая реализация может обрабатывать только строковые типы, что не очень удобно для больших приложений.

Давайте добавим функции для обработки типов bool , slice и integer.

Обновите файл .env, указав эти переменные среды.

Теперь вы можете получить доступ к этим значениям из остальной части вашего приложения:

Вот и все

Существует несколько библиотек, которые утверждают, что предлагают конфигурационное
«решение» для вашего приложения Go. Но действительно ли это решение, если его
так же легко сделать самому?

Узнайте о переменных среды и различных способах их использования в приложении Golang.

Пунит Сингх

Бесплатный, безопасный и надежный способ аутентификации посетителей

Добавьте логин на свой сайт за 5 минут совершенно бесплатно!

Бесплатная регистрация Никаких скрытых платежей. Кредитная карта не требуется.

Прежде чем начать

В этом руководстве предполагается, что у вас есть:

  • Основное понимание языка Go.
  • В вашей системе установлена ​​последняя версия Golang
  • Несколько минут вашего времени.

В этой статье мы узнаем о переменных среды и о том, зачем их использовать. И будет получать к ним доступ в приложении Go, используя встроенные и сторонние пакеты.

Что такое переменные среды?

Переменные среды представляют собой пару "ключ-значение" на общесистемном уровне, и запущенные процессы могут получить к ним доступ. Они часто используются для того, чтобы заставить одну и ту же программу вести себя по-разному в разных средах развертывания, таких как PROD, DEV или TEST. Хранение конфигурации в среде — один из принципов двенадцатифакторного приложения.Это позволяет приложениям быть переносимыми.

Зачем использовать переменные среды

  • Если вы используете конфиденциальную информацию в коде, то все неавторизованные пользователи, имеющие доступ к коду, будут иметь конфиденциальные данные, а вам это может быть не нужно.
  • Если вы используете инструмент управления версиями кода, такой как git , вы можете передать свои учетные данные БД вместе с кодом, и он станет общедоступным.
  • Если вы управляете переменными в одном месте, в случае каких-либо изменений вам не нужно изменять их во всех местах кода приложения.
  • Вы можете управлять несколькими средами развертывания, такими как PROD, DEV или TEST. Переменные среды легко изменить между развертываниями без изменения кода приложения.

Никогда не забывайте включать файлы переменных среды в .gitignore

Встроенный пакет ОС

Вам не нужен внешний пакет для доступа к переменным среды в Golang, и вы можете сделать это с помощью стандартного пакета ОС. Ниже приведен список функций, связанных с переменными окружения и их использования.

  • os.Setenv() устанавливает значение значения среды.
  • os.Getenv() получает значение переменной среды, названной по ключу.
  • os.Unsetenv() удаляет одно значение среды, названное ключом, если мы попытаемся получить это значение среды с помощью os.Getenv(), оно вернет пустое значение.
  • os.ExpandEnv заменяет $ или $var в строке в соответствии со значениями переменных среды. Если какая-либо переменная окружения отсутствует, ее заменит пустая строка.
  • os.LookupEnv() получает значение переменной среды, названной по ключу. Если переменная отсутствует в системе, возвращаемое значение будет пустым, а логическое значение будет ложным. В противном случае возвращается значение (которое может быть пустым) и логическое значение равно true.

os.Getenv() вернет пустую строку, если переменная окружения отсутствует. Чтобы отличить пустое значение от неустановленного, используйте LookupEnv.

Теперь давайте воспользуемся всеми вышеуказанными функциями в нашем коде. Создайте файл main.go в пустой папке.

Ниже показан вывод, когда мы запускаем go run main.go в нашем терминале

Есть еще две функции os.Clearenv и os.Environ(), используем их тоже в отдельной программе.

  • os.Clearenv удаляет все переменные среды. Может быть полезно очистить среду для тестов
  • os.Environ() возвращает часть строки, содержащей все переменные среды, в форме ключ=значение.

Приведенная выше функция выводит список всех переменных среды, доступных в системе, включая NAME и DB_HOST . Как только мы запустим os.Clearenv(), она очистит все переменные среды для запущенного процесса.

пакет godotenv

Проект Ruby dotenv вдохновлен пакетом GoDotEnv, он загружает переменные среды из файла .env

Давайте создадим файл .env, в котором будут все наши конфигурации.

Затем в файле main.go мы будем использовать godotenv для загрузки переменных среды.

мы также можем загружать несколько файлов env одновременно. godotenv также поддерживает YAML.

Откройте терминал и запустите main.go

Пакет Viper

Viper — это комплексное решение для настройки приложений Go, включая приложения с двенадцатью факторами. Он предназначен для работы в приложении и может обрабатывать все типы потребностей конфигурации и форматов.

Viper поддерживает множество форматов файлов для загрузки переменных среды, например чтение из файлов конфигурации JSON, TOML, YAML, HCL, envfile и свойств Java. Итак, в этом примере мы рассмотрим, как загружать переменные среды из файла YAML.

YAML – это удобный для чтения язык сериализации данных. Он обычно используется для файлов конфигурации и в приложениях, где данные хранятся или передаются.

Давайте создадим наши config.yaml и main.go в пустой папке.

В приведенном ниже коде мы используем Viper для загрузки переменных среды из файла config.yaml. Мы можем загрузить файл конфигурации из любого пути, который мы хотим. Мы также можем установить значения по умолчанию для любой переменной среды, если какая-либо переменная среды недоступна в файле конфигурации.

Откройте терминал и запустите main.go

Заключение

Использование переменных среды — отличный способ управления конфигурацией в нашем приложении. В целом, он обеспечивает простую настройку, улучшенную безопасность, несколько сред развертывания и меньшее количество производственных ошибок.

Теперь вы можете управлять переменными среды в своем приложении go, и вы можете найти полный код, используемый в этом руководстве, в нашем репозитории Github

При разработке и развертывании внутреннего веб-приложения нам обычно приходится использовать разные конфигурации для разных сред, таких как разработка, тестирование, подготовка и производство.

Сегодня мы узнаем, как использовать Viper для загрузки конфигураций из файла или переменных среды.

Зачем нужны переменные файла и среды

Alt Text
< /p>

Чтение значений из файла позволяет нам легко указать конфигурацию по умолчанию для локальной разработки и тестирования.

Хотя чтение значений из переменных среды поможет нам переопределить настройки по умолчанию при развертывании нашего приложения в промежуточной или рабочей среде с использованием контейнеров Docker.

Почему Viper

Alt Text
< /p>

Viper — очень популярный пакет Golang для этой цели.

  • Он может находить, загружать и распаковывать значения из файла конфигурации.
  • Он поддерживает множество типов файлов, таких как JSON, TOML, YAML, ENV или INI.
  • Он также может считывать значения из переменных среды или флагов командной строки.
  • Это дает нам возможность устанавливать или переопределять значения по умолчанию.
  • Более того, если вы предпочитаете хранить свои настройки в удаленной системе, такой как Etcd или Consul, вы можете использовать viper для прямого чтения данных из них.
  • Он работает как для незашифрованных, так и для зашифрованных значений.
  • Еще одна интересная особенность Viper заключается в том, что он может отслеживать изменения в файле конфигурации и уведомлять об этом приложение.
  • Мы также можем использовать viper для сохранения любых изменений конфигурации, которые мы внесли в файл.

Много полезных функций, не так ли?

Что мы будем делать

В текущем коде нашего простого банковского проекта мы жестко запрограммировали некоторые константы для dbDriver и dbSource в файле main_test.go, а также еще одну константу для serverAddress в файле main.go.

Выйти из полноэкранного режима

Итак, в этом руководстве мы узнаем, как использовать Viper для чтения этих конфигураций из файла и переменных среды.

Установить Viper

Хорошо, начнем с установки Viper! Откройте браузер и найдите golang viper .

Затем откройте его страницу Github. Прокрутите немного вниз, скопируйте эту команду go get и запустите ее в терминале, чтобы установить пакет:

Выйти из полноэкранного режима

После этого в файле go.mod нашего проекта мы видим, что Viper был добавлен в качестве зависимости.

Создать файл конфигурации

Теперь я создам новый файл app.env для хранения наших значений конфигурации для разработки. Затем скопируем эти переменные из файла main.go и вставим в этот файл конфигурации. Поскольку мы используем формат dot env, мы должны изменить способ объявления этих переменных. Это должно быть похоже на то, как мы объявляем переменные среды:

  • Каждая переменная должна быть объявлена ​​в отдельной строке.
  • Имя переменной написано в верхнем регистре, а ее слова разделены символом подчеркивания.
  • За значением переменной следует имя после символа равенства.

Выйти из полноэкранного режима

И все! Этот файл app.env теперь содержит конфигурации по умолчанию для нашей локальной среды разработки. Далее мы будем использовать Viper для загрузки этого файла конфигурации.

Загрузить файл конфигурации

Давайте создадим новый файл config.go внутри пакета util.

Затем объявите в этом файле структуру конфигурации нового типа. Эта структура Config будет содержать все переменные конфигурации приложения, которые мы считываем из файла или переменных среды. На данный момент у нас есть только 3 переменные:

  • Во-первых, DBDriver строкового типа,
  • Во-вторых, DBSource , также строкового типа.
  • И, наконец, ServerAddress типа string.

Выйти из полноэкранного режима

Чтобы получить значения переменных и сохранить их в этой структуре, нам нужно использовать функцию демаршалинга Viper. Viper использует встроенный пакет mapstructure для распаковки значений, поэтому мы используем теги mapstructure для указания имени каждого поля конфигурации.

В нашем случае мы должны использовать точное имя каждой переменной, объявленное в app.env. Например, имя тега DBDriver должно быть DB_DRIVER , имя тега DBSource должно быть DB_SOURCE и аналогично для ServerAddress должно быть SERVER_ADDRESS .

Хорошо, теперь я собираюсь определить новую функцию LoadConfig() , которая принимает путь в качестве входных данных и возвращает объект конфигурации или ошибку . Эта функция будет считывать конфигурации из файла конфигурации внутри пути, если он существует, или переопределять их значения с помощью переменных среды, если они предоставлены.

Выйти из полноэкранного режима

Сначала мы вызываем viper.AddConfigPath(), чтобы сообщить Viper расположение файла конфигурации. В этом случае местоположение задается аргументом входного пути.

Затем мы вызываем viper.SetConfigName(), чтобы указать Viper искать файл конфигурации с определенным именем. Наш файл конфигурации называется app.env , поэтому его имя — app .

Мы также сообщаем Viper тип конфигурационного файла, в данном случае env, вызывая viper.SetConfigFile() и передавая env . Вы также можете использовать здесь JSON, XML или любой другой формат, просто убедитесь, что ваш файл конфигурации имеет правильный формат и расширение.

Теперь, помимо чтения конфигураций из файла, мы также хотим, чтобы viper считывал значения из переменных среды. Поэтому мы вызываем viper.AutomaticEnv(), чтобы указать viper автоматически переопределять значения, которые он прочитал из файла конфигурации, значениями соответствующих переменных среды, если они существуют.

Выйти из полноэкранного режима

После этого мы вызываем viper.ReadInConfig(), чтобы начать чтение значений конфигурации. Если error не равен nil , мы просто возвращаем его.

В противном случае мы вызываем viper.Unmarshal() для демаршалирования значений в целевой объект конфигурации. И, наконец, просто верните объект конфигурации и любую ошибку, если она произойдет.

Итак, функция загрузки конфигурации завершена. Теперь мы можем использовать его в файле main.go.

Использовать LoadConfig в основной функции

Давайте удалим все предыдущие жестко заданные значения. Затем в функции main() вызовем util.LoadConfig() и передаем "." здесь, что означает текущую папку, потому что наш файл конфигурации app.env находится в том же месте, что и этот файл main.go.

Если есть ошибка, то мы просто пишем фатальный лог о том, что не можем загрузить конфигурацию. В противном случае мы просто изменим эти переменные на config.DBDriver, config.DBSource и config.ServerAdress.

Выйти из полноэкранного режима

И готово! Попробуем запустить этот сервер.

Выйти из полноэкранного режима

Это работает! Сервер прослушивает локальный порт 8080, точно так же, как мы указали в файле app.env.

Давайте откроем Postman и отправим запрос API. Я вызову API списка учетных записей.

Alt Text
< /p>

К сожалению, у нас возникла внутренняя ошибка сервера 500 . Это потому, что наш веб-сервер не может подключиться к базе данных Postgres через порт 5432. Откроем терминал и проверим, запущен ли Postgres:

Выйти из полноэкранного режима

Alt Text
< /p>

Нет запущенных контейнеров. Если мы запустим docker ps -a , мы увидим, что контейнер Postgres был закрыт. Итак, мы должны запустить его, запустив:

Выйти из полноэкранного режима

Хорошо, теперь база данных настроена и работает. Вернемся к Postman и снова отправим запрос.

Alt Text
< /p>

На этот раз успешно. У нас есть список аккаунтов. Так что наш код для загрузки конфигураций из файла работает хорошо.

Давайте попробуем переопределить эти конфигурации с помощью переменных среды. Я установлю переменную SERVER_ADDRESS на порт localhost 8081 перед вызовом make server .

Выйти из полноэкранного режима

Здесь мы видим, что сервер теперь прослушивает порт 8081 вместо 8080, как раньше. Теперь, если мы попытаемся отправить тот же запрос API в Postman на порт 8080, мы получим ошибку отказа в подключении:

Alt Text
< /p>

Только когда мы изменим этот порт на 8081, тогда запрос будет успешным:

Alt Text
< /p>

Итак, мы можем заключить, что Viper успешно переопределил значения, считанные из файла конфигурации, с переменными среды. Это очень удобно, когда мы хотим в будущем развернуть приложение в разных средах, таких как промежуточная или производственная.

Использовать LoadConfig в тесте

Теперь, прежде чем мы закончим, давайте обновим файл main_test.go, чтобы использовать новую функцию LoadConfig().

Во-первых, удалите все жестко запрограммированные константы. Затем в функции TestMain() мы вызываем util.LoadConfig() .

Но на этот раз файл main_test.go находится внутри папки db/sqlc, а файл конфигурации app.env — в корне репозитория, поэтому мы должны указать этот относительный путь: «../.. " . Эти 2 точки .. в основном означают переход в родительскую папку.

Выйти из полноэкранного режима

Если ошибка не nil , то мы просто пишем фатальный лог. В противном случае мы должны изменить эти два значения на config.DBDriver и config.DBSource .

И все! Были сделаны. Давайте запустим тест всего пакета.

Alt Text
< /p>

Все прошло! На этом лекция о чтении конфигурации из файла и переменных среды завершается.

Я настоятельно рекомендую вам ознакомиться с документацией и попробовать некоторые другие интересные функции viper, такие как просмотр в реальном времени или чтение из удаленной системы.

Удачного программирования и увидимся на следующей лекции!

Если вам понравилась статья, подпишитесь на наш канал Youtube и следите за нами в Twitter, чтобы получать новые руководства в будущем.

Если вы хотите присоединиться ко мне в моей замечательной команде в Voodoo, ознакомьтесь с нашими вакансиями здесь. Удаленно или на месте в Париже/Амстердаме/Лондоне/Берлине/Барселоне с визовым спонсорством.

Читайте также: