bythe.net
← К ленте
Проект

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, но не находил повода.

Войти, чтобы оценить материал

Комментарии

Войти, чтобы оставить комментарий