Как использовать модуль управления lerna

Node.js NPM
Как использовать модуль управления lerna

Когда интерфейсный проект становится все больше и больше, мы обычно разделяем общедоступный код и поддерживаем его как отдельный пакет npm. Но таким образом управление зависимостями между различными пакетами очень проблематично. Чтобы решить эту проблему, мы можем управлять разными проектами пакетов npm в одном проекте. Такая стратегия развития проекта также известна какmonorepo. Lerna — один из таких инструментов, который поможет вам лучше выполнять эту работу. В этой статье подробно рассказывается, как использовать Lerna для управления зависимостями пакетов.

Что такое Лерна

Согласно определению на официальном сайте, Lerna — это инструмент, который использует git и npm для управления зависимостями нескольких пакетов, что может автоматически помочь нам управлять зависимостями версий между различными пакетами модулей. В настоящее время многие публичные библиотеки уже используют Lerna в качестве инструмента управления зависимостями модулей, например: babel, create-react-app, react-router, jest и т. д.

Общие команды

bootstrap

С помощью команды bootstrap будут загружены все зависимости, определенные в package.json. эквивалентно выполнениюnpm installИ ссылки на все зависимости.

publish

Когда вы закончите обновление пакета, вы можете использоватьlerna publishКоманда для публикации новой версии пакета. При выполнении этой команды вы можете указать номер версии, и тогда lerna автоматически добавит обновленный номер версии для вас, добавит тег и отправит его в репозиторий git.

add

Предположим, вы хотите добавить зависимость к определенному пакету в своем проекте разработки, вы можете использоватьaddКоманда упрощает задачу:

# 给a, b 包中加入Lodash,会同时改变a,b模块中packages.json文件
lerna add lodash packages/a packages/b 
# 给a 包中加入jquery, 使用--dev参数是使依赖加入到devDependencies中
lerna add jquery packages/a --dev
# 你也可以使用通配符, 下面这命令,会往所有re开头的模块包中加入依赖
lerna add jquery packages/re-* 
# 指定特定的范围,要使用--scope参数,如下:给b包安装a模块
lerna add a --scope=b

clean

Выполните чистую команду, чтобы удалить пакеты npm в node_modules во всех модулях.

import

Вы можете использовать команду import для импорта существующих модулей и сохранения всех записей git commit.

list

Перечислите все модули в проекте.

run

Запустите скрипт npm в каждом модуле, содержащем скрипт.

Рукопашный бой

Сказав так много, давайте напишем пример, чтобы попрактиковаться.

Инициализировать проект

Сначала создаем новый проект, затем глобально устанавливаем lerna, выполняем операции инициализации и загружаем в репозиторий git. :

npm intall lerna -g
mkdir lerna-demo && cd $_
lerna init
git init
git add .
git commit -m "Initial Commit"
git remote add origin http://github.com/scq000/lerna-demo.git
git push -u origin master
ls

После выполнения вышеуказанной команды в текущем каталоге будут созданы следующие файлы:

packages/ package.json lerna.json

Среди них: Каталог пакетов используется для хранения различных общедоступных баз кода, которые нам нужно разделить. Файл lerna.json записывает соответствующую информацию о конфигурации lerna:

{
  "version": "1.1.3",
  "npmClient": "npm",
  "command": {
    "publish": {
      "ignoreChanges": ["ignored-file", "*.md"],
      "message": "chore(release): publish"
    },
    "bootstrap": {
      "ignore": "component-*",
      "npmClientArgs": ["--no-package-lock"]
    }
  },
  "packages": ["packages/*"]
}

Функция каждого элемента конфигурации представлена ​​отдельно:

  • версия: записать номер версии текущего проекта
  • npmClient: вы можете указать использовать npm, cnpm или yarn для выполнения команд.
  • command.publish.ignoreChanges: игнорировать определенные элементы
  • command.publish.npmClientArgs: параметры, передаваемые в npm install при выполнении команды lerna bootstrap
  • command.publish.message: при публикации модуля заполните информацию об уступке
  • Пакеты: адрес по умолчанию пакет модуля

Вы можете изменить соответствующую конфигурацию самостоятельно в соответствии с вашими потребностями.

Создайте два новых модуля

Для удобства демонстрации мы создадим два новых модуля, модуль A и модуль B, и пусть модуль A зависит от модуля B:

lerna create module-a
lerna create module-b
# 将本地包链接起来,可以直接引用
lerna link

Измените входной файл модуля-b:

export const sayHello() {
    return "hello world";
};

Измените входной файл модуля-a:

const moduleB = require('module-b');

const moduleA = function() {
    console.log(moduleB.sayHello());
}

export default moduleA;

Публиковать новые модули

После завершения модификации мы можем напрямую опубликовать новый модуль.

lerna publish

Затем введите номер версии в соответствии с подсказкой, и lerna автоматически пометит пакет для нас и загрузит его на соответствующий склад.

Я надеюсь, что этот простой пример может познакомить вас с простым процессом работы.

два режима

lerna позволяет нам управлять нашими модулями, используя два типа модулей: фиксированный режим и независимый режим.

Fixed/Locked mode

Этот режим также используется по умолчанию при инициализации проекта. В этом режиме вы можете понимать это как «полный релиз». То есть, как только у нас будет обновлена ​​основная версия модуля, все пакеты будут иметь новый номер версии. Основной номер версии хранится в файле lerna.json в корневом каталоге проекта.

Independent mode

Если вам не нравится приведенный выше шаблон, вы также можете использовать независимый шаблон для управления модулями в своем проекте. Вам нужно только указать параметр --independent в проекте инициализации:

lerna init --independent

В этом режиме мы можем самостоятельно обновлять номер версии пакета, что можно понимать как «инкрементальный выпуск».

Возможные проблемы и решения

Упаковка идет слишком медленно

В процессе использования наиболее часто встречающаяся проблема заключается в том, что выполнениеlerna bootstrapочень медленно, когда. Обычно это происходит из-за того, что в каждом отдельном пакете неоднократно устанавливаются общие зависимости. В настоящее время мы можем переместить все общедоступные пакеты, такие как react, lodash и т. д., в package.json в корневом каталоге и использоватьlerna bootstrap --hoistкоманда для установки. использоватьhoistПосле выбора опции все общедоступные зависимости будут установлены только в каталоге node_modules корневого каталога и не будут сохранять свои собственные зависимые пакеты в node_modules в каждом каталоге пакетов.

Таким образом,lerna bootstrapЭффективность выполнения значительно повышается.

Зависимости нескольких версий пакета несовместимы

Другая распространенная проблема, с которой можно столкнуться, заключается в том, что версии нескольких установочных пакетов несовместимы.Например, пакет A должен зависеть от lodash 1.0, а пакет B должен зависеть от lodash 2.0. Это приведет к большому количеству повторяющегося кода в процессе упаковки. И держать разные версии пакетов npm в одном проекте также сложно. Для этой проблемы в большинстве случаев мы можем попробовать использовать предоставленный менеджер пакетов npm.peerDependenciesвозможность исправить номер версии. Это может не только избежать большого количества повторяющегося кода, но и решить проблему конфликта, вызванную разными номерами версий.

#использованная литература

github.com/lerna/lerna

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

微信扫描二维码,关注我的公众号
Наконец, приглашаю всех обратить внимание на мой официальный аккаунт и вместе учиться и общаться.