direnv

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

Общая конфигурация наших проектов хранится в файлах .env и .env.local, притом последний не версионируется и служит для переопределения каких-либо настроек в локальном окружении.

Как и всегда, для полной идентичности версий ваших инструментов на всех машинах разработчиков, я предлагаю устанавливать direnv с помощью asdf:

asdf plugin add direnv
asdf install direnv latest

В каталоге с проектом фиксируем версию:

asdf local direnv latest

Не забудьте добавить в rc-файл вашего шелла инициализацию:

eval "$(direnv hook zsh)"

# и перезапуститься
exec $SHELL

Теперь остаётся этап конфигурации самого проекта. direnv читает файл .envrc, и чтобы наша структура с файлами .env и .env.local работала автоматически, создаём в корне проекта файл .envrc со следующим содержимым:

dotenv
dotenv_if_exists .env.local

Первая инструкция загружает файл .env. Вторая — загружает файл .env.local, только если он существуют.

Как только всё настроено, не забудьте разрешить загружать переменные окружения автоматически, выполнив следующую команду в корне проекта:

direnv allow

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

Ссылки