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

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

Вот тут-то и пригодятся монорепозитории. В одном репозитории может быть несколько пакетов. Все они могут использовать одну и ту же папку node_modules. Вы можете легко сделать их зависимыми друг от друга и опубликовать их все сразу. Не нужно управлять версиями, lerna позаботится об этом.

Начиная

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

$ yarn init

Это должно создать ваш package.json файл.

Здесь вы должны workspaces указать папки, в которых вы создали свои пакеты. Обратите внимание на version здесь, это 1.0.0 в начале, но по мере вашего продвижения, lerna будет обновлять его соответственно.

Хороший образец - использовать конфигурацию conventionalCommits с lerna для управления версиями. Подробнее об этом можно прочитать здесь.

Eg. package.json

При следующем запуске lerna init вы можете комбинировать флаг --independent, если хотите поддерживать версии каждого пакета отдельно.

Eg. lerna.json

Параметр useWorkspaces позволяет нам повторно использовать параметр для рабочих пространств Yarn в качестве параметра рабочего пространства Лерны.
Вы можете переключить параметр npmClient с yarn на npm, если хотите, чтобы npm запускал все ваши команды. Наконец, параметр commands настроен на использование conventionalCommits для нашего процесса публикации.

Добавление пакетов

Вы можете создать папку пакетов и начать добавлять туда свои пакеты или использовать эту команду $ npx lerna create @projectName/packagename.

Добавление пакетов npm в качестве зависимостей

С рабочими областями yarn вам не нужно подключаться к каждой папке пакетов, чтобы установить зависимости, все, что вам нужно сделать, это $ yarn workspace @projectName/yourpackagename add npm-package-name

Если вы хотите установить общие зависимости, $ yarn add -W --dev typescript prettier eslint.

Довольно гладко, правда? 😎

Издательский

После того, как вы разместили свои пакеты в соответствующих каталогах, самое время их опубликовать. lerna publish - это команда, используемая для публикации ваших пакетов.

Если вы использовали шаблон Обычные фиксации, вы можете использовать флаг --conventional-commits с приведенной выше командой, чтобы определить версию вашего пакета. С помощью этой опции Лерна генерирует CHANGELOG.md для новой версии.

Вот пример.

$ npx lerna publish --conventional-commits
lerna notice cli v3.19.0
lerna info versioning independent
lerna info Looking for changed packages since @zoomify/[email protected]
lerna info getChangelogConfig Successfully resolved preset "conventional-changelog-angular"

Changes:
    - @zoomify/rest-api-client: 1.0.0 => 1.1.0
    - @zoomify/cutomize-uploader: 3.0.1 => 3.0.2

? Are you sure you want to publish these packages? (ynH)
:
Successfully published:
    - @zoomify/[email protected]
    - @zoomify/[email protected]
lerna success published 2 packages

Запускать npm-скрипты в нескольких пакетах

Даже с удобными командами рабочих пространств пряжи может быть сложно тестировать и создавать каждый пакет, если вы хотите запустить команду для всех пакетов, просто сделайте это,

Например, допустим, я хочу собрать все свои пакеты перед публикацией.
$ npx lerna run build --stream, это вызовет команду сборки, указанную в package.json файлах каждого пакета.

Вывод

В этом отношении одними из лучших примеров являются репозиторий React на Github. Помните, что для знакомства с монорепозиториями требуется практика. Несколько недель работы над ними научат вас.