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

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

Версионирование и публикация

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

Чтобы показать, как это работает, мы рассмотрим этот репозиторий.

Если вам проще учиться на практике, клонируйте репозиторий и следуйте инструкциям.

Репозиторий содержит три пакета или проекта:

  • header (библиотека React-компонентов)

  • footer (библиотека React-компонентов)

  • remixapp (приложение на фреймворке Remix, зависящее от header и footer)

Мы опубликуем пакеты header и footer.

Обычно публикуется только часть проектов. Некоторые проекты могут быть приватными (например, только для тестов), другие — демонстрационными приложениями. В этом репозитории remixapp не является «приватным» в смысле сокрытия кода — он просто использует настройку "private": true, чтобы не публиковаться в NPM.

Версионирование

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 исключает все пакеты, помеченные как private в их package.json.

Lerna определяет текущие пакеты, находит их версии и предлагает следующую. Вы также можете явно указать версию, например lerna version 1.0.0. Подробнее в документации по версионированию. После выбора версии Lerna обновляет package.json, фиксирует изменения, добавляет тег версии (например v1.0.0) и отправляет коммит с тегом в удалённый репозиторий.

packages/footer/package.json
{
"name": "footer",
"version": "1.0.1",
"main": "dist/index.js",
...
}

Эта операция не отправляет пакеты в NPM. Для публикации используйте lerna publish.

информация

Lerna определяет текущую версию через свойство version в lerna.json

Публикация в NPM

Если выполнить

lerna publish --no-private

Lerna выполнит процесс версионирования (как lerna version) и дополнительно опубликует пакеты в NPM. Вы увидите следующий вывод:

Terminal Output
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) Patch (1.0.1)

Changes:
- footer: 1.0.0 => 1.0.1
- header: 1.0.0 => 1.0.1

? Are you sure you want to publish these packages? Yes
lerna info execute Skipping releases
lerna info git Pushing tags...
lerna info publish Publishing packages to npm...
...
lerna success published header 1.0.1
...
lerna success published footer 1.0.1
...
Successfully published:
- footer@1.0.1
- header@1.0.1
lerna success published 2 packages

from-package

Альтернативный способ публикации — from-package. Lerna сравнит версии пакетов в репозитории с опубликованными в npm. Пакеты с более новой версией будут опубликованы.

Этот режим не требует предварительного версионирования через lerna version, что удобно для рабочих пространств со своими скриптами версионирования.

lerna publish from-package
информация

Lerna всегда использует npm для публикации пакетов. При использовании менеджера пакетов, отличного от npm, вам всё равно нужно добавить соответствующую конфигурацию публикации в .npmrc, даже если в lerna.json для npmClient указано значение, отличное от npm.

Стратегии версионирования

Lerna предлагает два режима управления версиями: фиксированный (Fixed) или независимый (Independent).

Фиксированный режим (Fixed/Locked) (по умолчанию)

Проекты Lerna в фиксированном режиме работают с единой линейкой версий. Версия хранится в файле lerna.json в корне вашего проекта под ключом version. При запуске lerna publish, если пакет был обновлён с момента последнего релиза, его версия будет повышена до новой выпускаемой версии. Это означает, что новая версия пакета публикуется только при необходимости.

Примечание: При использовании мажорной версии 0 все обновления считаются критическими (breaking). Поэтому запуск lerna publish с мажорной версией 0 и выбор любой версии, не являющейся пререлизом, приведёт к публикации новых версий для всех пакетов, даже если не все изменились с последнего релиза.

Используйте этот подход, если хотите автоматически связать версии всех пакетов. Недостаток: критическое изменение в любом пакете приведёт к увеличению мажорной версии у всех пакетов.

Синхронизированные версии

По умолчанию Lerna повышает версию и публикует только изменённые пакеты, что со временем приводит к расхождению версий. Чтобы этого избежать, используйте опцию --force-publish с командой lerna version. Это заставит Lerna всегда повышать версию всех пакетов, независимо от изменений. Затем все они будут опубликованы в реестре через lerna publish from-git. В результате версии всех пакетов останутся синхронизированными с версией в lerna.json.

Независимый режим

npx lerna init --independent

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

Независимый режим позволяет точнее управлять версиями для каждого пакета и оптимален для групп компонентов. Его сочетание с инструментами вроде semantic-release упростит процесс (разработка ведётся в atlassian/lerna-semantic-release).

Для активации независимого режима установите значение independent для ключа version в файле lerna.json.