Skip to content

Instantly share code, notes, and snippets.

@Etheresk
Last active May 6, 2023 11:01
Show Gist options
  • Save Etheresk/11a8f21e31bcdf1fae7ede5da322159f to your computer and use it in GitHub Desktop.
Save Etheresk/11a8f21e31bcdf1fae7ede5da322159f to your computer and use it in GitHub Desktop.
Simple and beginners friendly guide to Lerna [Russian]

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

Содержание


Установка


Перед использованием 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


Вы можете опубликовать ваши пакеты в NPM с помощью следующей команды:

lerna publish

Эта команда опубликует все измененные пакеты в NPM.

Использование флагов


Lerna имеет множество флагов, которые позволяют настроить его поведение. Некоторые из них:

  • --scope: позволяет работать только с указанным пакетом
  • --ignore: позволяет игнорировать указанные пакеты
  • --concurrency: позволяет настроить количество параллельных задач
  • --hoist: флаг команды lerna bootstrap, выносит общие зависимости пакетов в рут
  • --nohoist: противодействие для --hoist

Использование Lerna с Git


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 более подробно в официальной документации.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment