devenv: окружение разработки из Nix без изучения Nix
Одним файлом описываются языки, базы, сервисы и хуки, а Nix гарантирует одинаковый результат на любом ноутбуке. Docker для этого больше не нужен.
Проблема «у меня работает»
Новый человек в команде тратит первый день на установку правильной версии Node, Postgres нужной мажорной версии, Redis, инструментов для миграций и ещё десятка мелочей из README, которое никто не обновлял с прошлого года. Docker Compose решает часть задачи, но редактор, линтеры и отладчик живут снаружи контейнера, и расхождения продолжаются.
Nix умеет решать это полностью: каждая зависимость описана точно, вплоть до хеша, и собирается в изолированное окружение. Проблема в том, что язык Nix и его экосистема отпугивают даже опытных инженеров.
Что делает devenv
devenv прячет Nix за декларативным конфигом с понятными опциями. Файл devenv.nix в корне проекта описывает всё окружение:
{ pkgs, ... }: {
languages.elixir.enable = true;
languages.javascript.enable = true;
languages.javascript.npm.enable = true;
services.postgres.enable = true;
services.postgres.initialDatabases = [{ name = "app_dev"; }];
services.redis.enable = true;
packages = [ pkgs.ffmpeg ];
git-hooks.hooks.mix-format.enable = true;
}
Команда devenv shell открывает оболочку, где всё это есть, а devenv up поднимает Postgres и Redis как процессы в текущей сессии, без Docker и без системной установки. Версии фиксируются в devenv.lock, поэтому через полгода окружение соберётся таким же.
Чем лучше Docker для разработки
- Инструменты работают нативно: нет накладных расходов виртуализации на macOS, нет проблем с правами на примонтированные тома.
- Редактор и LSP видят те же версии языков, что и сборка.
- Один конфиг заменяет Dockerfile, docker-compose,
.tool-versions,.nvmrcи настройку pre-commit. - Кеш бинарных пакетов означает, что ничего не компилируется на ноутбуке.
Для продакшена Docker остаётся на месте: devenv решает задачу разработки, а не деплоя. Хотя при желании из того же конфига собирается и контейнер.
Интеграция
С direnv окружение активируется автоматически при входе в директорию проекта. В CI тот же devenv.nix даёт идентичные инструменты, что убирает ещё один источник расхождений между локальной машиной и сборкой.
Подводные камни
Первая установка Nix на macOS по-прежнему требует внимания: он создаёт отдельный том и правит системные файлы. Пакет, которого нет в nixpkgs, придётся описать самостоятельно, и тут Nix всё-таки придётся выучить. Дисковое пространство под хранилище растёт, и периодическая сборка мусора нужна.
Кому подойдёт
Командам, где регулярно появляются новые люди и где уже устали от расхождений окружений. Одиночным разработчикам с несколькими проектами на разных версиях языков. Тем, кто хотел попробовать Nix, но не находил повода.
Войти, чтобы оценить материал
Комментарии
Войти, чтобы оставить комментарий