Lerna - это инструмент управления многопакетными репозиториями с открытым исходным кодом. Он позволяет разработчикам управлять несколькими пакетами в одном монорепозитории, включая версионирование, публикацию, управление зависимостями и сборку.
- Установка
- Создание нового монорепозитория
- Добавление нового пакета
- Установка зависимостей
- Изменение версии
- Публикация пакета на NPM
- Использование флагов
- Использование Lerna с Git
- Как пушить в отдельный пакет?
- Как обновлять версии зависимостей?
- Как билдить пакеты?
- Как подключать сбилженные пакеты из локального/удаленного монорепозитория в проекты?
- Заключение
Перед использованием Lerna необходимо его установить. Вы можете сделать это с помощью npm, выполнив следующую команду:
npm install -g lerna
Вы можете создать новый монорепозиторий с помощью следующей команды:
lerna init
Эта команда создаст структуру каталогов для вашего монорепозитория и установит Lerna в него.
Вы можете добавить новый пакет в ваш монорепозиторий с помощью следующей команды:
lerna create <имя нового пакета>
Lerna создаст каталог packages/my-package и заполнит его шаблонными файлами для нового пакета. Вы можете изменить содержимое этих файлов, чтобы адаптировать их под свои нужды.
lerna bootstrap
Эта команда установит все зависимости для всех пакетов в вашем монорепозитории и свяжет их между собой.
Lerna поставляется с командой version
, которая позволяет вам поднять версию вашего пакета, зафиксировать изменения и пометить их соответствующим образом. Чтобы изменить версию всех пакетов, используйте следующую команду:
lerna version --no-private
вы получите следующий результат:
lerna notice cli v5.1.2
lerna info current version 1.0.0
lerna info Assuming all packages changed
? Select a new version (currently 1.0.0) (Use arrow keys)
❯ Patch (1.0.1)
Minor (1.1.0)
Major (2.0.0)
Prepatch (1.0.1-alpha.0)
Preminor (1.1.0-alpha.0)
Premajor (2.0.0-alpha.0)
Custom Prerelease
Custom Version
Обратите внимание, что передавая --no-private
, мы исключаем все пакеты, которые помечены как приватные в их package.json.
Lerna обнаруживает текущие пакеты, определяет текущую версию и предлагает выбрать следующую. Обратите внимание, вы также можете передавать новую версию напрямую, типа
lerna version 1.0.0
. После выбора версии Lerna обновляет package.json с номером версии, фиксирует изменение, добавляет соответствующий тег версии (например, v1.0.0) и переносит коммит и тег в удаленный репозиторий.
Если вы хотите обновить версию определенного пакета, используйте флаг --scope
, например:
lerna version <version> --scope my-package
Вы можете опубликовать ваши пакеты в NPM с помощью следующей команды:
lerna publish
Эта команда опубликует все измененные пакеты в NPM.
Lerna имеет множество флагов, которые позволяют настроить его поведение. Некоторые из них:
--scope
: позволяет работать только с указанным пакетом--ignore
: позволяет игнорировать указанные пакеты--concurrency
: позволяет настроить количество параллельных задач--hoist
: флаг команды lerna bootstrap, выносит общие зависимости пакетов в рут--nohoist
: противодействие для--hoist
Lerna хорошо интегрируется с Git. Он может автоматически создавать коммиты и теги для изменений в версии пакетов. Вы можете использовать следующие команды для работы с Git в Lerna:
lerna changed
: показывает пакеты, которые были изменены в последнем коммитеlerna diff
: показывает различия между двумя версиями указанного пакетаlerna run <command> --since <last-version>
: запускает команду для всех пакетов, которые были изменены с последней версии
Когда вы работаете в монорепозитории, вам нужно помнить, что изменения в пакете должны быть зафиксированы в отдельном коммите. Чтобы запушить изменения только в один пакет, вы можете использовать команду lerna exec
, которая позволяет выполнить команду для каждого пакета в монорепозитории. Например, если вы хотите запушить изменения только в пакете my-package, вы можете выполнить следующую команду:
lerna exec --scope my-package -- git push origin main
Эта команда выполнит команду git push
для каждого пакета, удовлетворяющего условию --scope my-package
. Таким образом, изменения будут запушены только в пакет my-package.
Lerna позволяет легко обновлять версии зависимостей в монорепозитории. Вы можете использовать команду lerna add
, чтобы добавить или обновить зависимость во всех пакетах монорепозитория. Например, если вы хотите обновить версию пакета lodash для всех пакетов, вы можете выполнить следующую команду:
lerna add lodash
Если вы хотите добавить зависимость только для определенного пакета, вы можете использовать флаг --scope
. Например, если вы хотите добавить зависимость react только для пакета my-package, вы можете выполнить следующую команду:
lerna add react --scope my-package
Lerna позволяет легко билдить все пакеты в монорепозитории. Вы можете использовать команду lerna run build
, чтобы выполнить команду build
для каждого пакета в монорепозитории. Например, если вы хотите сбилдить все пакеты в монорепозитории, вы можете выполнить следующую команду:
lerna run build
Если вы хотите сбилдить только определенный пакет, вы можете использовать флаг --scope
. Например, если вы хотите собрать только пакет my-package, вы можете выполнить следующую команду:
lerna run build --scope my-package
Lerna также позволяет определять специфические скрипты для каждого пакета в монорепозитории. Для этого в файле package.json
каждого пакета можно добавить скрипты с префиксом lerna
(например, lerna:build
). Затем вы можете использовать команду lerna run
для запуска этих скриптов для всех пакетов в монорепозитории.
После того, как вы сбилдили свои пакеты, вы можете использовать их в других проектах, подключив их как зависимости. В зависимости от того, где располагается ваш монорепозиторий, вы можете использовать различные способы для установки зависимостей. Если вы используете пакеты в том же монорепозитории (например для приложений в папке apps/
). То можно просто указать *
в качестве источника пакета например:
{
"dependencies": {
"my-package": "*"
}
}
Если вы собираетесь использовать пакет в других проектах в локальном пространстве, вы можете использовать команду npm link
, чтобы установить сбилженные пакеты в другой проект. Например, если вы хотите подключить пакет my-package из вашего монорепозитория в другой проект, вы можете выполнить следующие команды:
cd packages/my-package
npm link
cd /путь/до/другого/проекта
npm link my-package
Эти команды создадут символическую ссылку на пакет my-package в другом проекте, используя установленный пакет локально на вашем компьютере.
Если ваш монорепозиторий расположен удаленно, вы можете использовать npm install
, pnpm install
или yarn add
для установки зависимости из удаленного репозитория. В этом случае вам нужно будет указать путь к репозиторию в package.json вашего проекта. Например, если ваш монорепозиторий расположен на GitHub и вы хотите подключить пакет my-package в другом проекте, вы можете добавить следующую зависимость в package.json вашего проекта:
"dependencies": {
"my-package": "github:user/my-repo#v1.0.0"
}
Это указывает на пакет my-package в вашем удаленом репозитории на GitHub и версию "v1.0.0"
Если вы используете Lerna, то вместо указания версии пакета в package.json
можно использовать команду lerna link
, которая создаст символические ссылки на все пакеты в монорепозитории в вашем проекте.
cd /путь/до/другого/проекта
lerna link
Это был краткий гайд основных фишек и команд Lerna, которые могут помочь вам при работе с монорепозиториями. Lerna может значительно упростить процесс разработки и управления зависимостями в больших проектах, так что, если вы работаете над проектом, который может быть организован в монорепозиторий, рекомендуется изучить Lerna более подробно в официальной документации.