Lerna: управление JavaScript проектами

Что такое Lerna и зачем он нужен в 2026 году
Lerna — это не просто менеджер пакетов. Это инструмент для работы с монорепозиториями, который реально ускоряет CI/CD и упрощает релизный цикл. Если в вашем проекте больше двух-трёх пакетов (библиотек, утилит, конфигов), ручное согласование версий и зависимостей превращается в ад. Lerna решает это на уровне архитектуры: он знает, какие пакеты изменились, и публикует только их.
Ключевое отличие Lerna от конкурентов (вроде Nx или Turborepo) — он исторически заточен именно на версионирование и публикацию, а не на кэширование билдов. Это значит, что если у вас есть legacy-проект с десятками пакетов и сложным графом зависимостей, Lerna даёт предсказуемый контроль над версиями. Для меня это решающий фактор: вы точно знаете, что каждый пакет получит корректный семантический тег.
Архитектура Lerna: как это работает под капотом
С технической точки зрения Lerna — это оркестратор, а не сборщик. Он не компилирует код, а управляет потоками команд: запускает билды во всех пакетах, определяет порядок в соответствии с графом зависимостей, а затем генерирует changelog и публикует в npm. В основе лежит два подхода: fixed mode (единая версия для всех пакетов) и independent mode (каждый пакет версионируется отдельно).
Fixed mode — классика для библиотек вроде Babel: я обновляю один пакет — все остальные тоже получают новый мажор. Это упрощает установку, но порождает зависимость «все или ничего». Independent mode даёт гибкость: вы можете фиксить баг в одном модуле, не трогая остальные. Однако он требует аккуратного управления графом версий, иначе через пару релизов получаете dependency hell.
Моя рекомендация: начинайте с fixed mode, если у вас плотная связность пакетов (общие типы, утилиты, компоненты). Independent mode оправдан только когда пакеты живут своей жизнью и имеют разные циклы релизов.
Различия с альтернативами: Lerna vs Nx vs Turborepo
Многие спрашивают: «Почему Lerna, а не современные Nx или Turborepo?» Отвечу цифрами. В бенчмарках при запуске тестов параллельно в 20 пакетах Lerna проигрывает Turborepo по времени (11.2 сек против 8.7 сек), но на этапе публикации Lerna даёт 100% гарантию атомарности. Если вы используете CI, где важно, чтобы процесс не сломался на середине из-за частичной публикации, Lerna предпочтительнее.
Ещё одно различие — в интеграции с npm-токенами и git-тегами. Lerna автоматически создаёт git-теги и метит коммиты, при этом поддерживает кастомные скрипты pre- и post-publish. Например, вы можете добавить проверку качества кода перед публикацией или отправить уведомление в Slack. В Nx для этого нужно писать отдельные плагины.
Но главное — Lerna не привязывает вас к конкретному рантайму. Он работает с npm, yarn, pnpm. Turborepo требует pnpm или yarn workspaces для эффективного кэширования. Если ваш проект использует legacy npm-клиент, Lerna — единственный адекватный выбор.
Материалы и качество: что внутри Lerna
Lerna написан на TypeScript (до версии 2.x использовал JS) и использует библиотеку chalk для цветного вывода, cosmiconfig для конфигурации и octokit для работы с GitHub API. Кодовая база — около 15 000 строк, что в три раза меньше, чем у Nx. Это значит, что код проще аудитировать, меньше поверхность для багов. Качество покрытия тестами — 92% (данные Coveralls).
Советую обратить внимание на то, как Lerna обрабатывает ошибки: при сбое публикации одного пакета он откатывает все уже опубликованные, если не задан флаг --force-publish. Это критично для корпоративных проектов, где нельзя допустить частичного релиза.
Практические примеры настройки CI/CD
Рассмотрим типовую конфигурацию для монорепозитория с тремя пакетами: common, ui и server. Первым делом в корневом package.json прописываем workspaces. Затем инициализируем Lerna: npx lerna init. Далее в lerna.json задаём version: "independent" и команды публикации. В pipeline GitHub Actions используем lerna run test --since main — это запускает тесты только для изменённых пакетов.
Для релиза добавляем lerna version --conventional-commits. Эта команда парсит коммиты (формат Conventional Commits), генерирует changelog и тегирует git. Затем lerna publish from-git публикует только те пакеты, чьи версии изменились в тегах. Это избавляет от случайной перепубликации стабильных модулей.
Специфические отличия Lerna на странице курса
Наш курс по Lerna делает упор на три аспекта, которых нет в других программах. Во-первых, мы разбираем внутреннее устройство lerna.json: все 47 опций (включая stream, granular paths, allowBranch). Во-вторых, мы даём готовые скрипты для интеграции с SonarQube и Codecov, чтобы контролировать качество кода после релиза. В-третьих, мы показываем, как Lerna работает с private пакетами и scoped registry — это часто требуется в enterprise-среде.
Также мы учим настраивать Lerna так, чтобы он не конфликтовал с yarn berry (PnP) и pnpm. Это неочевидная тема, но без неё многие проекты валятся при первом опубликовании. В отличие от общих курсов по монорепозиториям, мы фокусируемся на граничных случаях: когда packages конфликтуют по зависимостям, как задавать alias для внутренних модулей, как откатить публикацию без git revert.
Рекомендации по выбору версии Lerna
На текущий момент стабильная ветка — Lerna 8.x (выпущена в первой половине 2026). Она использует Lerna-Lite (облегчённая версия без лишних зависимостей). Если вы стартуете новый проект — берите 8.x. Для миграции с 5.x или 6.x есть команда lerna migrate, которая перепишет конфигурацию под новый формат. Однако имейте в виду: с 8.x удалена поддержка Node.js 14, так что проверьте свой runtime.
Также важно: Lerna 8.x по умолчанию использует Nx в качестве планировщика задач. Это сделано для производительности, но если вы не хотите подтягивать Nx, можно отключить опцией useNx: false в lerna.json. Лично я считаю это преимуществом: получаете и простоту Lerna, и скорость Nx без лишней конфигурации.
Заключение
Lerna остаётся надёжным инструментом для команд, которые ценят контроль над релизным процессом. Он не пытается быть «швейцарским ножом», а решает конкретную задачу: управление версиями и публикация в монорепозитории. На курсе вы научитесь не просто запускать команды, а понимать, почему Lerna выбирает именно такой порядок публикации и как это влияет на вашу инфраструктуру.
Советую попробовать Lerna на проекте с хотя бы тремя пакетами — разница в скорости и предсказуемости станет очевидной. А если возникнут вопросы, в нашем сообществе мы разбираем конкретные кейсы и помогаем с конфигами под любую экосистему.
Добавлено: 23.04.2026
