Управление несколькими десятками пакетов в одном репозитории без автоматизации приводит к хаосу: ручное версионирование, конфликты межпакетных зависимостей, дублирование кода. Каждая новая фича требует синхронизации нескольких пакетов, что вручную занимает часы. Lerna решает эти проблемы, предоставляя единый интерфейс для версионирования, сборки и публикации. Наш опыт насчитывает более пятидесяти monorepo-проектов, и Lerna остается основным выбором для библиотек и утилит, публикуемых в npm. Это фундамент для масштабирования кодовой базы без боли. Ниже — детальный разбор того, как мы настраиваем Lerna под ключ: от анализа до CI/CD и документации. Получите консультацию инженера, чтобы оценить, подходит ли Lerna для вашего проекта.
Почему Lerna, а не Turborepo или Nx?
Lerna имеет смысл, когда проект — библиотека или набор пакетов, которые публикуются в npm. Требуется автоматическое управление версиями (semver) и CHANGELOG. Команда небольшая, сложная инфраструктура избыточна. Для закрытого продукта без публикации — лучше Turborepo или Nx. Lerna 6+ возродился под управлением Nrwl с опциональным Nx под капотом для кеширования и параллельного выполнения задач. Экономия времени на сборке достигает 50% при 20+ пакетах.
Настройка Lerna: пошаговый процесс
Анализ и конфигурация
Начинаем с определения режима: independent или fixed. Согласовываем стек, CI-провайдера, менеджер пакетов. pnpm ускоряет установку на 30% и экономит до 50% дискового пространства за счет дедупликации. Инициализируем Lerna, настраиваем lerna.json, workspaces, подключаем commitlint и husky для контроля conventional commits. Обучение команды занимает 2–3 часа.
npx lerna init --packages="packages/*" --independent Пример lerna.json:
{ "$schema": "node_modules/lerna/schemas/lerna-schema.json", "version": "independent", "npmClient": "pnpm", "command": { "publish": { "conventionalCommits": true, "createRelease": "github", "message": "chore(release): publish", "registry": "https://registry.npmjs.org", "allowBranch": ["main", "next"] }, "version": { "conventionalCommits": true, "conventionalChangelogConfig": "@conventional-changelog/conventionalcommits", "changelogPreset": "angular", "gitTagVersion": true, "push": true }, "bootstrap": { "npmClientArgs": ["--no-package-lock"] } }, "useWorkspaces": true, "useNx": true } Структура репозитория
Организуем пакеты в packages/: например, button, input, modal. Каждый пакет — независимая единица с tsconfig и тестами. Для документации используем apps/docs (Storybook).
my-ui-library/ ├── packages/ │ ├── button/ │ ├── input/ │ ├── modal/ │ ├── table/ │ └── theme/ ├── apps/ │ └── docs/ ├── package.json ├── lerna.json └── pnpm-workspace.yaml Управление версиями и публикация
| Команда | Описание |
|---|---|
lerna changed | Показывает изменившиеся пакеты |
lerna version | Интерактивно обновляет версии |
lerna version --conventional-commits --yes | Автоматически по conventional commits |
lerna publish from-package | Публикует все неопубликованные пакеты |
lerna publish from-git | Публикует пакеты, для которых созданы git-теги |
При запуске lerna version происходит определение изменившихся пакетов, предложение новых версий по semver, обновление package.json и межпакетных зависимостей, генерация CHANGELOG.md, создание git-коммита и тегов. Весь процесс занимает менее 5 минут для 20 пакетов.
Как Lerna интегрируется с CI/CD?
Пайплайн строится на GitHub Actions или GitLab CI. Ключевой момент — автоматическая публикация только при слиянии в main. Используем lerna version --conventional-commits --yes для генерации версии и changelog, затем lerna publish from-git для публикации. Для масштабирования включаем useNx: true — это дает кеширование и параллельное выполнение задач, сокращая время сборки до 10 минут даже для 50+ пакетов. В результате релиз занимает 15 минут вместо нескольких часов, что снижает затраты на CI/CD на 30–40%.
# .github/workflows/release.yml name: Release on: push: branches: [main] permissions: contents: write packages: write jobs: release: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 token: ${{ secrets.GITHUB_TOKEN }} - uses: pnpm/action-setup@v3 - uses: actions/setup-node@v4 with: node-version: 20 registry-url: 'https://registry.npmjs.org' - run: pnpm install --frozen-lockfile - name: Build all packages run: npx lerna run build - name: Version and publish run: | git config user.email "[email protected]" git config user.name "CI Bot" npx lerna version --conventional-commits --yes --no-push npx lerna publish from-git --yes env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} Запуск задач с Nx под капотом
Lerna 6+ использует Nx для умного запуска:
npx lerna run build npx lerna run test --since=main npx lerna run build --scope=@acme/modal --include-dependents Кеширование Nx позволяет повторно использовать результаты сборки, экономя до 70% времени при повторных запусках. Это особенно важно для крупных monorepo с сотнями пакетов.
Independent или fixed mode?
Для библиотек компонентов или утилит, которые выпускаются асинхронно, independent mode — единственный разумный выбор. Каждый пакет версионируется независимо, что позволяет исправлять баги в одном пакете без затрагивания других. В fixed mode, как в React или Vue, все пакеты синхронизированы — это проще, но менее гибко. Мы рекомендуем independent mode для проектов с разной частотой релизов. Экономия времени на согласование версий составляет 2–3 часа в неделю.
Что входит в настройку
- Полностью сконфигурированный monorepo с Lerna и выбранным менеджером пакетов (pnpm/npm/yarn)
- CI/CD пайплайн (GitHub Actions или GitLab CI) для автоматической публикации при слиянии в main
- Документация процесса релиза с правилами conventional commits
- Онбординг команды (демо-сессия 2–4 часа)
- Поддержка в течение 2 недель после внедрения: исправление ошибок, консультации
Окупаемость такой настройки — менее 3 месяцев за счет сокращения ручного труда и ошибок при релизе.
Типичные сложности
При обновлении версии через lerna version зависимость может не обновиться, если указан мягкий диапазон (^ или ~). Флаг --force-publish обновляет все пакеты принудительно, а хардкодные версии (без caret) гарантируют обновление. CHANGELOG может дублировать записи — используйте --changelog-include-commits-root-path если нужны корневые коммиты. Публикация на CI может упасть из-за npm publish --dry-run в .npmrc — убедитесь, что dry-run=false в CI окружении.
Сроки и стоимость
Настройка Lerna для набора npm-пакетов с нуля занимает от 2 до 5 дней в зависимости от сложности. Стоимость рассчитывается индивидуально. Свяжитесь с нами для оценки вашего проекта и получите консультацию инженера с многолетним опытом в JavaScript-экосистеме. Закажите настройку monorepo под ключ и убедитесь в эффективности автоматизации.







