Перерождение Lerna. Что нового в Lerna 6?
- среда, 2 ноября 2022 г. в 00:56:26
Состоялся релиз Lerna 6!!! В статье собрано все, что вы должны знать о новом опыте, который предлагает Lerna!
Если вы и так это знаете, то можете не читать дальше. Но многие все еще не слышали, что Lerna вернулась, не устарела и даже получает новые фичи. Мы из Nrwl являемся создателями Nx, и, учитывая нашу экспертизу в монорепозиториях, мы предложили взять на себя развитие Lerna, когда она была объявлена "мертвой" в апреле 2022 года.
Когда мы получили управление над Lerna начались настоящие американские горки. Мы запустили совершенно новый сайт, обновили документацию и сделали Lerna в 10 раз быстрее. И вот, Lerna 6 вышла!
Начиная с Lerna 4, для планирования выполнения задач использовались npm пакеты p-map
и p-queue
. В версии 5.1 мы представили nx
как дополнительный механизм для планирования. Преимущества? Nx имеет встроенный механизм кэширования, что делает Lerna молниеносно быстрой. Недавний тест производительности показал, что Lerna быстрее чем Lage в 2,5 раза и в 4 раза быстрее чем Turbo (на момент октября 2022 г., можете проверить сами).
Раньше вам нужно было влючать Nx специальным флагом useNx
в lerna.json
:
// lerna.json
{
...
"useNx": true
}
Мы тестировали эту возможность последние несколько месяцев и получили много удивительного фидбэка от компаний и open-source проектов. И как результат, начиная с 6-ой версии флаг useNx
включен по умолчанию во всех воркспейсах Lerna. Если вы не хотите использовать Nx просто установите значение useNx: false
.
Перед использованием кэширования убедитесь, что в корне воркспейса Lerna есть файл nx.json
, в котором определены кэшируемые операции. Для дополнительной конфигурации ознакомьтесь с документацией. Пример конфигурационного файла:
{
"tasksRunnerOptions": {
"default": {
"runner": "nx/tasks-runners/default",
"options": {
"cacheableOperations": ["build", "test"]
}
}
}
}
Обратите внимание, что вы можете сгенерировать файл nx.json
автоматически, основываясь на конфигурации Lerna:
npx lerna add-caching
Используя Nx как планировщик задач Lerna получает все его возможности. Это включает не только локальное кэширование, но и облачное кэширование (remote caching) и распределенное выполнение задач (distributed task execution).
Облачное кэширование позволяет распространять ваш локальный кэш между коллегами и вашей CI системой. Это делается с помощью Nx Cloud. Но облачное кэширование лишь одна сторона. Nx Cloud также предоставляет "run view", которое визуализирует ваши CI запуски с возможностью группировки и фильтрации, а еще Nx Cloud умеет динамически распределять ваши задачи между несколькими машинах. Все это оптимизируется для наилучшего распараллеливания и использования ресурсов.
Все что вам нужно запустить команду в воркспейсе Lerna:
npx nx connect-to-nx-cloud
В процессе вы ответите на несколько вопросов и настроите Nx Cloud.
Подробнее читайте в документации.
Запуская задачи в монорепе вы хотите все делать максимально параллельно, но при этом учитывать потенциальные зависимости между задачами. Для примера, допустим у вас есть Remix приложение, которое зависит от библиотеки shared-ui
. Вы хотите убедиться, что shared-ui
будет собрана до того как будет собрано или запущенно Remix приложение.
С Lerna 6 вы можете сделать это, определив в nx.json
файле targetDefaults
:
// nx.json
{
...
"targetDefaults": {
"build": {
"dependsOn": ["^build"]
},
"dev": {
"dependsOn": ["^build"]
}
}
}
В этом случае когда бы вы не запустили build
или dev
, Lerna сначала запустит задачу build
для всех зависимых пакетов.
Подробнее читайте в документации.
Если вы все еще не настроили кэширование или пайплайн задач, то не переживайте. Мы хотели сделать это как можно проще и предоставили команду:
npx lerna add-caching
Команда просканирует ваш воркспейс, найдет все package.json скрипты и поможет настроить как кэширование, так и пайплайн задач.
Краткое пошаговое видео:
В любом случае, вы всегда сможете создать nx.json
сами.
Ранее Lerna не поддерживала как следует PNPM. Исправили это в Lerna 6. Теперь, когда вы используете Lerna в сочетании с PNPM, мы обязательно находим пакеты на основе pnpm-workspace.yaml
, обеспечиваем использование useWorkspaces: true
, при использовании lerna version
соответствующим образом обновляем pnpm-lock.yaml
, а также поддерживаем протокол workspace:
, который использует PNPM.
Теперь вы наконец-то можете использовать один из самых быстрых пакетных менеджеров вместе с новой быстрой Lerna. Вы обязательно должны ознакомиться с этим более подробно в документации.
Порой запуская пареллельно задачи для большого количества проектов бывает достаточно сложно понять какой именно проект собрался или не собрался по терминальному выводу. Именно поэтому новая версия Lerna поставляется с динамическим терминальным выводом, который показывает только то, что действительно необходимо в данный момент.
Обратите внимание, что вы по-прежнему будете видеть все выходные данные, как обычно, в CI.
Теперь Lerna имеет специальное расширение для VSCode, которое поможет вам работать с монорепой. Оно позволяет вам запускать команды прямо из контекстного меню (при нажатии правой клавиши мыши на проекте):
Или визуализировать проект с его зависимостями в воркспейсе:
Также вы получите умное автодополнение в конфигурационных файлах. Вот пример Nx Console, предоставляющей контекстную информацию при редактировании targetDefaults
в nx.json
:
Lerna 6 поставляет вместе с командой lerna repair
. Запуск этой команды автоматически исправит вашу конфигурацию Lerna. Например, в Lerna 6 нет необходимости указывать useNx: true
в lerna.json
, так как это значение по умолчанию. Запуск lerna repair
исправляет это.
Это позволяет вам иметь самые свежие настройки Lerna, и они будут становиться еще более мощными по мере того, как мы будем добавлять миграции в будущем.
Сейчас Prettier это часть стандартного набора инструментов каждого разработчика. В Lerna 6 мы добавили возможность определения установлен ли Prettier в воркспейсе. Если Prettier установлен, то мы применяем его ко всем файлам, которые были обновлены с помощью lerna version
. Больше никакого второго коммита для исправления форматирования!
Миграция с Lerna 5 на Lerna 6 неломающая. Мы подняли мажорную версию, потому что изменили некоторые настройки по умолчанию и хотели рассказать об этом должным образом.
Даже если вы все еще используете 4-ую версию и хотите мигрировать на 6-ую, то это должно быть очень просто и без ломающих изменений в большинстве случаев.
Просто обновите пакет lerna и запустить команду
npx lerna add-caching
для включения и настройки кэширования в вашей воркспейсе.
У вас не получилось или вам нужна помощь? Существует канал Slack, организованный сообществом, где также присутствуют основные участники Nx и Lerna. Присоединяйтесь к https://go.nrwl.io/join-slack и войдите в #lerna
канал.
Конечно! Одним из ключевых преимуществ новой интеграции Lerna с Nx является то, что вы можете продолжать использовать существующие команды Lerna без изменений. Теперь они будут намного быстрее.
Подробнее об этом можно прочитать в нашей документации .
Если вы поддерживаете open-source проект и используете Lerna, сообщите нам об этом!
Свяжитесь с командой Lerna в Твиттере или свяжитесь со мной напрямую . Мы хотели бы посмотреть и помочь с миграцией, посмотреть репозиторий и убедиться, что он настроен оптимальным образом.
А еще как мейнтейнер проекта с открытым исходным кодом, вы также получаете неограниченное бесплатное облачное кэширование с помощью Nx Cloud. Так что мы хотели бы помочь вам с настройкой.
👩💻 Lerna GitHub
💬 Nrwl Community Slack (присоединяйтесь к #lerna
каналу)
🧐 Нужна помощь с Angular, React, Monorepos, Lerna или Nx? Поговорите с нами!