Перейти к основному содержимому
Неофициальный Бета-перевод

Эта страница переведена PageTurner AI (бета). Не одобрена официально проектом. Нашли ошибку? Сообщить о проблеме →

Устаревшее управление пакетами

примечание

В Lerna v9, выпущенной в сентябре 2025 года, команды lerna bootstrap, lerna add и lerna link были окончательно удалены после более чем двух лет устаревания. Если вы всё ещё используете эти команды, пожалуйста, перейдите на давно поддерживаемую функцию workspaces вашего менеджера пакетов.

Следующее руководство предоставит предысторию и поможет понять, почему и как выполнить миграцию.

Ещё в июне 2023 года, в Lerna v7.0.0, мы убрали команды lerna bootstrap, lerna add и lerna link из Lerna по умолчанию. Более чем два года спустя, в Lerna v9.0.0, эти команды были окончательно полностью удалены.

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

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

Добиться этого можно с помощью функции workspaces вашего менеджера пакетов. Соответствующая документация:

Используя workspaces, ваш менеджер пакетов будет выполнять те же самые операции связывания, которые раньше делали за вас lerna bootstrap и lerna link, но теперь это встроено прямо в команду install. После запуска установки никаких дополнительных команд не требуется (при условии, что вы настроили workspaces в соответствии с документацией вашего менеджера пакетов).

То же самое касается замены lerna add. Добавление и удаление зависимостей — это то, что ваш менеджер пакетов уже умеет делать, и поскольку workspaces — это полноценный сценарий использования, вы можете выполнить соответствующую команду install, чтобы добавить зависимость в конкретный пакет/рабочее пространство, и все необходимые локальные связи будут установлены автоматически.

Более конкретные сравнения и примеры использования до и после смотрите ниже.

Что делает эта команда?

lerna bootstrap использовалась вместо npm install (или yarn/pnpm). Она устанавливала все внешние пакеты и связывала все внутренние пакеты в рабочем пространстве. lerna link выполняла только шаг внутреннего связывания.

Где она может использоваться?

Скорее всего, в свойстве "scripts" файла package.json в корне вашего рабочего пространства. Также проверьте ваши CI-конвейеры, так как они тоже могут вызывать lerna bootstrap вместо npm install (или yarn/pnpm).

Чем ее заменить?

Замените lerna bootstrap на npm install (или yarn/pnpm). Если вы уже выполняете команду установки вашего менеджера пакетов где-то в вашем рабочем процессе до того места, где вы ранее вызывали lerna bootstrap, то вы можете просто удалить этот вызов. lerna link можно просто убрать, так как шаг связывания теперь выполняется вашим менеджером пакетов во время npm install.

информация

Если вы используете yarn и полагаетесь на связывание бинарных файлов, вам может потребоваться удалить папку node_modules один раз после перехода на рабочие пространства. Подробности см. в этой проблеме yarn.

Замена использования lerna add

Что делает эта команда?

lerna add использовалась для добавления зависимости в пакеты рабочего пространства. Она обновляла файлы package.json каждого пакета, добавляя зависимость.

Где она может использоваться?

Хотя обычно ее вызывали вручную, lerna add может встречаться в некоторых скриптах файла package.json в корне вашего рабочего пространства.

Чем ее заменить?

lerna add в основном можно заменить вариацией команды npm install (или yarn/pnpm). Самый распространённый сценарий использования lerna add — добавление одной зависимости в один пакет рабочего пространства. Эта команда выглядит так:

lerna add <dependency> --scope <package>

и её можно напрямую заменить на:

npm install <dependency> -w <package>

Флаг -w указывает npm установить зависимость только в пакете рабочего пространства, указанном в <package>, аналогично опции --scope в Lerna.

Если вам нужно добавить зависимость в несколько пакетов, вы можете использовать опцию -w несколько раз:

npm install <dependency> -w <package1> -w <package2>

Пользовательское поднятие зависимостей (Hoisting)

Одно из преимуществ устаревшей команды bootstrap в Lerna — контроль, который она давала над поднятием (hoisting) определённых зависимостей в корень репозитория или их оставлением во вложенных расположениях.

Поэтому вас может беспокоить переход с lerna bootstrap, если у вас довольно сложная настройка в плане поднятия пакетов.

По нашему опыту тестирования различных менеджеров пакетов, мы выяснили, что современный yarn (т.е. v3 и новее) предлагает наибольшую гибкость в управлении поднятием:

https://yarnpkg.com/configuration/yarnrc/#nmHoistingLimits

Мы ещё не встретили ни одного репозитория, использующего lerna bootstrap, независимо от сложности поднятия, который нельзя было бы преобразовать под современный yarn, поэтому попробуйте его, если это относится к вам.

Если вы использовали lerna bootstrap без каких-либо сложных настроек поднятия, можете выбрать любой менеджер пакетов — все они предлагают надёжные реализации workspaces.

Временное восстановление устаревших команд управления пакетами

Если в v7 или v8 вы столкнулись с трудностями и всё ещё нуждались в устаревших командах управления пакетами (lerna bootstrap, lerna add и lerna link), вы могли установить пакет @lerna/legacy-package-management той же версии, что и ваш пакет lerna, что добавляло обратно старые реализации этих команд.

Важно отметить, что это было лишь временное решение, и этот пакет сразу перешёл в режим только поддержки — никакие новые функции для устаревшего управления пакетами (такие как lerna bootstrap, lerna add и lerna link) не рассматривались, но мы применяли критические исправления и обновления безопасности.

Вся поддержка @lerna/legacy-package-management была прекращена в v9, спустя более чем два года после его появления как временного решения, что дало командам достаточно времени для миграции.

Предыстория

Lerna — это оригинальный инструмент для монорепозиториев/рабочих пространств в экосистеме JavaScript. Когда она была создана в 2015/2016 году, экосистема выглядела совершенно иначе, и не было встроенных возможностей для работы с несколькими пакетами в одном репозитории ("рабочее пространство"). Команды вроде lerna bootstrap, lerna add и lerna link были важной частью проекта Lerna, потому что других вариантов не было.

Однако факт в том, что уже много-много лет менеджеры пакетов, которые мы знаем и любим (npm, yarn и pnpm), полностью поддерживают концепцию рабочих пространств (workspaces) как первоклассный сценарий использования.

Они имеют проверенные в боях реализации, охватывающие добавление, удаление и связывание локальных пакетов, а также их комбинирование со сторонними зависимостями естественным образом.

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

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

Убрав эти устаревшие компоненты, для которых в менеджерах пакетов есть лучшие нативные альтернативы, мы и всё сообщество Lerna теперь можем сосредоточить усилия на наиболее ценных аспектах Lerna (таких как, но не ограничиваясь, управление версиями и публикация), доводя их до совершенства!

информация

Эти же вопросы обсуждаются в дискуссии о Lerna v7. Если у вас есть конкретные опасения, присоединяйтесь к обсуждению и предоставьте максимально подробную информацию!