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