Когда интерфейсный проект становится все больше и больше, мы обычно разделяем общедоступный код и поддерживаем его как отдельный пакет 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возможность исправить номер версии. Это может не только избежать большого количества повторяющегося кода, но и решить проблему конфликта, вызванную разными номерами версий.
#использованная литература
——Данная статья впервые опубликована в личном паблике, просьба указывать источник для перепечатки——
Наконец, приглашаю всех обратить внимание на мой официальный аккаунт и вместе учиться и общаться.