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

Lerna — это инструмент для управления монорепозиториями и проектами JavaScript, состоящими из нескольких пакетов.

Монорепозиториями бывает сложно управлять, поскольку последовательные сборки и публикация отдельных пакетов занимают много времени. К счастью, Lerna предоставляет такие функции, как загрузка пакетов, параллельная сборка и публикация артефактов, – они помогут вам при управлении монорепозиториями. Также Lerna полезна для проектов, которые имеют общие зависимости.

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

Требования

  • Локальная среда разработки Node.js версии 14+, которую можно создать, следуя инструкциям для вашего дистрибутива: Mac OSUbuntuCentOSDebian.
  • Установка npm версии 5.2 или выше на локальном компьютере. Если вы не установили npm вместе с Node.js, сделайте это сейчас. В Linux для этого используется команда sudo apt install npm.
  • Знакомство с JavaScript. Вы можете просмотреть серию How To Code in JavaScript, чтобы узнать больше.
  • Опционально: текстовый редактор для проверки содержимого проекта при необходимости, к примеру, Visual Studio Code (версия 1.65+) или Atom.
  • Опционально: Git версии 2.36 или выше.

1: Установка Lerna и инициализация проекта

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

Начнем с установки Lerna, это делается с помощью следующей команды:

npm i -g lerna

Команда npm i установит пакет lerna. Флаг -g устанавливает lerna глобально, что делает этот пакет доступным через терминал.

Примечание: Если вы столкнетесь с ошибками доступа, вам может потребоваться повторно запустить команду с правами администратора. Попробуйте запустить команду с помощью sudo.

Теперь вы можете перейти в любой удобный для вас каталог и создать в нем образец рабочего каталога для размещения проекта Lerna.

Выполните следующую команду, чтобы создать такой рабочий каталог:

mkdir lerna-demo

cd lerna-demo

Теперь можно запустить команду init:

lerna init

Вы получите такой вывод:

...
lerna notice cli v4.0.0
lerna info Initializing Git repository
lerna info Creating package.json
lerna info Creating lerna.json
lerna info Creating packages directory
lerna success Initialized Lerna files

Команда init создает файл lerna.json. Этот файл можно отредактировать при необходимости (в мануале мы оставим настройки по умолчанию). Эта команда также инициализирует репозиторий git и создает файл package.json и каталог packages/.

Итак, мы установили Lerna и инициализировали свой проект. Давайте создадим теперь монорепозиторий.

2: Создание монорепозитория

На этом этапе вы создадите монорепозиторий, необходимый для работы с Lerna. Монорепозиторий — это репозиторий, содержащий проект (или несколько проектов) и множество пакетов. Папки и пакеты, созданные здесь, необходимы для более поздних этапов данного руководства.

Используйте следующие команды, чтобы создать папку apple/ в каталоге packages/, а затем запустите npm init, чтобы настроить каталог:

mkdir apple

cd apple

npm init

Команда npm init вернет такой вывод:

...
❯ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items and tries to guess sensible defaults.

See `npm help init` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg>` afterward to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (apple) (ENTER)
version: (1.0.0) (ENTER)
description: (ENTER)
entry point: (index.js) (ENTER)
test command: (ENTER)
git repository: (ENTER)
keywords: (ENTER)
author: (ENTER)
license: (ISC) (ENTER)
About to write to lerna-demo/packages/apple/package.json:

{
  "name": "apple",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

Is this OK? (yes) y

Вы можете оставить значения по умолчанию. После создания и обновления папки apple/ повторите процесс, чтобы создать папки orange/ и banana/.

Теперь, когда у вас есть пакеты npm, инициализированные с помощью команды npm init, вы можете ввести команду bootstrap, которая запустит npm install во всех ваших пакетах. Команда bootstrap устанавливает зависимости пакетов и связывает пакеты вместе. Без начальной загрузки ваших пакетов зависимости не будут удовлетворены, а потому вы не сможете запускать сценарии npm в проекте.

Выполните следующую команду, чтобы загрузить пакеты npm из корневой папки проекта:

lerna bootstrap

Вы получите такой результат:

...
❯ lerna bootstrap
lerna notice cli v4.0.0
lerna info Bootstrapping 3 packages
lerna info Symlinking packages and binaries
lerna success Bootstrapped 3 packages

На этом этапе мы настроили монорепозиторий с тремя папками и загрузили свои пакеты в каталог. Далее мы добавим зависимости к пакетам в монорепозитории.

3: Установка пакетов в монорепозитории

В этом разделе мы с помощью Lerna установим тестовый пакет в свой монорепозиторий. Lerna поможет нам управлять пакетами и зависимостями между проектами в монорепозитории.

Чтобы добавить пакет в свой проект, используйте команду lerna exec – тогда команда будет выполнена в среде lerna:

lerna exec npm i lite-server –parallel

Для примера мы используем lite-server, так как это легкий пакет. Вы можете добавить и другие пакеты с помощью этого метода (все зависит от требований вашего проекта).

Флаг –parallel указывает, что сборка должна выполняться одновременно, это экономит время в процессе компиляции.

Результат должен выглядеть следующим образом:

...
❯ lerna exec npm i lite-server --parallel
lerna notice cli v4.0.0
lerna info Executing command in 3 packages: "npm i lite-server"
apple: added 179 packages, and audited 180 packages in 12s
apple: 6 packages are looking for funding
apple:   run `npm fund` for details
apple: found 0 vulnerabilities
orange: added 179 packages, and audited 180 packages in 12s
orange: 6 packages are looking for funding
orange:   run `npm fund` for details
orange: found 0 vulnerabilities
banana: added 179 packages, and audited 180 packages in 12s
banana: 6 packages are looking for funding
banana:   run `npm fund` for details
banana: found 0 vulnerabilities
lerna success exec Executed command in 3 packages: "npm i lite-server"

Сообщение lerna success в конце вывода указывает на то, что команда выполнена успешно и что вы установили пакет lite-server в каждую из папок проекта.

На этом этапе мы установили общую зависимость во все свои пакеты. Далее мы запустим скрипт в файле packages.

4: Запуск скриптов

Теперь мы запустим сценарии, которые настраивают сборку пакетов. Для запуска npm run <cmd> во всех пакетах проекта можно использовать lerna run <cmd>. Команда npm run запускает указанный скрипт в файле package.json.

Для примера мы запустим тестовый скрипт, который поставляется вместе с пакетами, добавленными в разделе 2:

lerna run test –no-bail

Флаг –no-bail запустит скрипт для всех пакетов, даже если скрипт определенного пакета выдал ошибку.

Вы получите такой вывод:

...

lerna notice cli v4.0.0
lerna info Executing command in 3 packages: "npm run test"
lerna info run Ran npm script 'test' in 'apple' in 0.2s:

> apple@1.0.0 test
> echo "Error: no test specified" && exit 1

Error: no test specified
lerna info run Ran npm script 'test' in 'banana' in 0.2s:

> banana@1.0.0 test
> echo "Error: no test specified" && exit 1

Error: no test specified
lerna info run Ran npm script 'test' in 'orange' in 0.2s:

> orange@1.0.0 test
> echo "Error: no test specified" && exit 1

Error: no test specified
lerna ERR! Received non-zero exit code 1 during execution
lerna success run Ran npm script 'test' in 3 packages in 0.2s:
lerna success - apple
lerna success - banana
lerna success - orange

С помощью этой команды мы запустили скрипт test. Поскольку мы не определили никаких тестов, мы получим стандартный вывод: “Error: no test specified”. Мы получили уведомление с exit code 1, но благодаря флагу –no-bail все сценарии выполняются без проблем. Если вы не передадите флаг –no-bail, Lerna сразу остановит выполнение после того, как проверка первого пакета завершится ошибкой.

Заключение

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

Чтобы сделать свои пакеты общедоступными, вы можете опубликовать их на выбранном вами артефакте. npmjs — общедоступный артефакт, куда вы можете отправить свои пакеты. Команда lerna publish может опубликовать все ваши пакеты одновременно. Сообщение lerna success означает, что вы успешно загрузили свои пакеты.

Tags: ,

Добавить комментарий