- Home »

Как управлять монорепозиториями с помощью Lerna
Монорепозитории — штука модная, но не только ради хайпа. Если у тебя в проекте несколько пакетов, библиотек, микросервисов или фронтовых приложений, раскиданных по разным репозиториям, рано или поздно ты устанешь синхронизировать версии, тянуть зависимости и разруливать адские конфликты. Тут на сцену выходит Lerna — инструмент, который помогает держать всё это добро в одном месте, автоматизировать рутину и не сойти с ума. В этой статье разберёмся, как Lerna работает, как его быстро поднять, какие грабли подстерегают, и почему это может быть ключом к автоматизации и удобству не только для разработчиков, но и для тех, кто отвечает за инфраструктуру и деплой.
Как работает Lerna: монорепозитории без боли
Lerna — это инструмент для управления JavaScript/TypeScript монорепозиториями. Он позволяет держать несколько пакетов (npm-модули, сервисы, утилиты) в одном репозитории, при этом автоматизируя установку зависимостей, публикацию, версионирование и сборку. В отличие от классического подхода «один репозиторий — один проект», монорепо с Lerna позволяет:
- Обновлять зависимости между пакетами централизованно
- Проводить атомарные изменения сразу во всех пакетах
- Собирать и деплоить только то, что реально изменилось
- Упрощать CI/CD пайплайны и автоматизацию
Внутри монорепозитория обычно есть папка packages/
, где лежат все твои модули. Lerna сканирует их, строит дерево зависимостей и позволяет работать с ними как с единым организмом. Это особенно круто, если у тебя есть, например, общий UI-kit, несколько микросервисов и CLI-утилита — всё это можно держать в одном репо и не париться о версиях и публикации.
Быстрый старт: как поднять Lerna за 10 минут
Давай без лишней воды — вот пошаговый гайд, как быстро развернуть монорепозиторий с Lerna. Всё, что тебе нужно — установленный node
и npm
(или yarn
/pnpm
).
-
Установи Lerna глобально:
npm install -g lerna
-
Создай новый репозиторий и инициализируй Lerna:
mkdir my-monorepo
cd my-monorepo
git init
lerna init
После этого появятся
lerna.json
,package.json
и папкаpackages/
. -
Добавь пакеты:
cd packages
mkdir core-api
cd core-api
npm init -y
Повтори для других пакетов (например,
ui-kit
,cli-tool
и т.д.). -
Установи зависимости для всех пакетов:
lerna bootstrap
Эта команда пройдётся по всем пакетам, установит зависимости и свяжет локальные пакеты друг с другом через симлинки.
-
Добавляй, обновляй, публикуй:
- Добавить зависимость в конкретный пакет:
lerna add lodash --scope=core-api
- Добавить локальную зависимость:
lerna add ui-kit --scope=core-api
- Запустить скрипт во всех пакетах:
lerna run build
- Публиковать пакеты:
lerna publish
- Добавить зависимость в конкретный пакет:
Всё, у тебя готов рабочий монорепозиторий. Дальше можно интегрировать CI/CD, писать скрипты для автоматизации, и не бояться, что что-то где-то отвалится из-за несовместимых версий.
Практические кейсы: плюсы, минусы и грабли
Монорепозитории — это не серебряная пуля. Вот несколько реальных сценариев, где Lerna может стать спасением, а где — источником боли.
Кейс | Плюсы | Минусы | Рекомендации |
---|---|---|---|
Много микросервисов на Node.js |
|
|
|
Фронтовый проект + дизайн-система |
|
|
|
Маленький проект с 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/
Если остались вопросы или хочется поделиться своим опытом — пиши в комменты, всегда рад обсудить грабли и лайфхаки!
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.