Home » Как управлять монорепозиториями с помощью Lerna
Как управлять монорепозиториями с помощью Lerna

Как управлять монорепозиториями с помощью Lerna

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

Как работает Lerna: монорепозитории без боли

Lerna — это инструмент для управления JavaScript/TypeScript монорепозиториями. Он позволяет держать несколько пакетов (npm-модули, сервисы, утилиты) в одном репозитории, при этом автоматизируя установку зависимостей, публикацию, версионирование и сборку. В отличие от классического подхода «один репозиторий — один проект», монорепо с Lerna позволяет:

  • Обновлять зависимости между пакетами централизованно
  • Проводить атомарные изменения сразу во всех пакетах
  • Собирать и деплоить только то, что реально изменилось
  • Упрощать CI/CD пайплайны и автоматизацию

Внутри монорепозитория обычно есть папка packages/, где лежат все твои модули. Lerna сканирует их, строит дерево зависимостей и позволяет работать с ними как с единым организмом. Это особенно круто, если у тебя есть, например, общий UI-kit, несколько микросервисов и CLI-утилита — всё это можно держать в одном репо и не париться о версиях и публикации.

Быстрый старт: как поднять Lerna за 10 минут

Давай без лишней воды — вот пошаговый гайд, как быстро развернуть монорепозиторий с Lerna. Всё, что тебе нужно — установленный node и npm (или yarn/pnpm).

  1. Установи Lerna глобально:
    npm install -g lerna
  2. Создай новый репозиторий и инициализируй Lerna:

    mkdir my-monorepo
    cd my-monorepo
    git init
    lerna init

    После этого появятся lerna.json, package.json и папка packages/.

  3. Добавь пакеты:

    cd packages
    mkdir core-api
    cd core-api
    npm init -y

    Повтори для других пакетов (например, ui-kit, cli-tool и т.д.).

  4. Установи зависимости для всех пакетов:
    lerna bootstrap

    Эта команда пройдётся по всем пакетам, установит зависимости и свяжет локальные пакеты друг с другом через симлинки.

  5. Добавляй, обновляй, публикуй:

    • Добавить зависимость в конкретный пакет: lerna add lodash --scope=core-api
    • Добавить локальную зависимость: lerna add ui-kit --scope=core-api
    • Запустить скрипт во всех пакетах: lerna run build
    • Публиковать пакеты: lerna publish

Всё, у тебя готов рабочий монорепозиторий. Дальше можно интегрировать CI/CD, писать скрипты для автоматизации, и не бояться, что что-то где-то отвалится из-за несовместимых версий.

Практические кейсы: плюсы, минусы и грабли

Монорепозитории — это не серебряная пуля. Вот несколько реальных сценариев, где Lerna может стать спасением, а где — источником боли.

Кейс Плюсы Минусы Рекомендации
Много микросервисов на Node.js
  • Общие утилиты и типы
  • Единая точка сборки
  • Лёгкая синхронизация зависимостей
  • Растёт время сборки
  • Конфликты при merge
  • Используй --since для сборки только изменённых пакетов
  • Разделяй CI-пайплайны по пакетам
Фронтовый проект + дизайн-система
  • Обновления UI-kit сразу во всех приложениях
  • Тесты и линтеры централизованно
  • Сложнее деплоить по отдельности
  • Проблемы с кэшированием node_modules
  • Используй Yarn Workspaces или pnpm для оптимизации node_modules
  • Внедри автоматические релизы через lerna publish
Маленький проект с 2-3 пакетами
  • Простота поддержки
  • Быстрый старт
  • Перегруз по конфигам
  • Избыточность
  • Возможно, проще обойтись без монорепо

Полезные команды Lerna


# Инициализация монорепозитория
lerna init

# Установка зависимостей и связывание локальных пакетов
lerna bootstrap

# Добавить зависимость в пакет
lerna add [package] --scope=[target-package]

# Запустить npm-скрипт во всех пакетах
lerna run [script]

# Показать список пакетов
lerna list

# Публикация пакетов
lerna publish

# Обновить версии пакетов
lerna version

# Выполнить команду во всех пакетах
lerna exec -- [command]

# Сборка только изменённых пакетов
lerna run build --since

Альтернативы и похожие решения

  • Yarn Workspaces — встроенная поддержка монорепо в Yarn, отлично работает в связке с Lerna. Документация
  • pnpm Workspaces — быстрый и экономный менеджер пакетов, поддерживает монорепо из коробки. Документация
  • Nx — мощная платформа для монорепозиториев, заточена под масштабируемые проекты, поддерживает кэширование и параллельные сборки. nx.dev
  • Rush — корпоративный инструмент от Microsoft, заточен под большие команды и сложные пайплайны. rushjs.io

Lerna — это скорее «швейцарский нож» для JS/TS монорепо, но если тебе нужно что-то более «батарейки в комплекте», смотри в сторону Nx или Rush.

Статистика и сравнение: что выбрать?

Инструмент Скорость Простота Фичи Поддержка
Lerna Средняя Высокая Базовые Большое комьюнити
Yarn Workspaces Высокая Средняя Базовые Хорошая
pnpm Workspaces Очень высокая Средняя Базовые Растёт
Nx Высокая (с кэшированием) Средняя Расширенные Активная
Rush Высокая Низкая Корпоративные Microsoft

Если тебе нужно просто и быстро — Lerna + Yarn Workspaces. Если проект растёт и появляются сложные зависимости, стоит посмотреть на Nx или Rush.

Интересные факты и нестандартные сценарии

  • Автоматизация деплоя микросервисов: Lerna позволяет запускать деплой только для тех пакетов, которые реально изменились. Это экономит время и ресурсы, особенно если у тебя десятки сервисов.
  • Сборка Docker-образов: Можно интегрировать Lerna с CI/CD, чтобы автоматически собирать и пушить Docker-образы только для обновлённых пакетов.
  • Миграции баз данных: Если у тебя есть пакет с миграциями, можно запускать их централизованно через Lerna, не плодя отдельные скрипты для каждого сервиса.
  • Общие скрипты и линтеры: Хочешь, чтобы все пакеты проходили одни и те же проверки? Просто добавь скрипт в корень и запускай через lerna run lint.
  • Интеграция с GitHub Actions: Lerna отлично дружит с CI/CD, можно запускать тесты, сборку и публикацию по событию push или pull request.

Новые возможности: автоматизация и скрипты

Монорепозитории с Lerna открывают кучу новых сценариев для автоматизации:

  • Автоматическое версионирование: Lerna умеет сам определять, какие пакеты изменились, и обновлять их версии. Это спасает от ручного ада с package.json.
  • Параллельные сборки: Можно запускать сборку или тесты сразу во всех пакетах, экономя время на CI.
  • Гибкая публикация: Публикуй только то, что реально изменилось, не засоряя npm лишними версиями.
  • Интеграция с внешними сервисами: Через хуки и скрипты можно запускать любые внешние процессы — от деплоя до мониторинга.
  • Сборка кастомных CLI: Если у тебя есть свой CLI для инфраструктуры, его удобно держать в монорепо и обновлять вместе с остальными пакетами.

Выводы и рекомендации

Lerna — это отличный способ навести порядок в большом проекте с кучей пакетов, сервисов и утилит. Он позволяет автоматизировать рутину, ускорить сборку и деплой, и не тратить время на синхронизацию версий. Если у тебя проект на Node.js/TypeScript с несколькими связанными модулями — Lerna даст тебе гибкость и контроль, а в связке с Yarn или pnpm Workspaces — ещё и скорость.

Рекомендую использовать Lerna, если:

  • У тебя больше двух связанных пакетов или сервисов
  • Нужна централизованная сборка и публикация
  • Хочешь автоматизировать CI/CD и деплой
  • Важно быстро обновлять общие зависимости

Если проект совсем маленький — возможно, монорепо будет избыточен. Но если ты планируешь масштабироваться, Lerna сэкономит тебе кучу времени и нервов.

Для хостинга и деплоя таких проектов отлично подойдут VPS или выделенные серверы — можно крутить CI/CD, Docker, и любые автоматизации без ограничений.

Официальная документация Lerna: https://lerna.js.org/

Если остались вопросы или хочется поделиться своим опытом — пиши в комменты, всегда рад обсудить грабли и лайфхаки!


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

Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.

Leave a reply

Your email address will not be published. Required fields are marked