первый контактmonorepo
Это было в начале прошлого года, очень случайно в то время возникла потребность в странице активности, т.к.webpack
Со сравнительными блюдами послушайте приятеляparcel
Готовые страницы активности записи непобедимы, и тогда я пошел проверить это. Видетьparcel
использовалlerna
, это вызвало мое любопытство, я думаю, что эта вещь очень метафизична, команда может помочь вам установить все зависимости в рамках указанного проекта, как раз, когда я училсяnodejs
Я также написал некоторые инструменты, такие как инструменты международного перевода, локальный фиктивный сервер, мониторинг страниц интерфейса и т. д., объединил эти проекты, использовалlerna
заверни это, простоinstall
После того, как все зависимости могут быть загружены, таким образом получается n элементов в проекте, образуя замкнутый цикл.
Конечно, приведенного выше понимания совершенно недостаточно.monorepo
Как подсказывает названиеmono + repository
Несколько складов объединены в один склад.monorepo
Сценарий использования состоит в том, что несколько модулей зависят друг от друга, или n модулей имеют взаимозависимые модули, поэтому взаимная ссылка должна быть очень хлопотной.В конце концов, никто не хочет видеть много относительных путей.Сейчас с популярностью ts, бизнес разработка сильно зависит от кода.Подскажите,если каждый из n модулей является самостоятельным проектом или библиотекой,как должен быть настроен путь в tsconfig? Еще хуже, если модуль А вводит стороннюю библиотеку, а модуль ядра нет, ядро просто вводит метод А, и ядро приходится вручнуюyarn add depxxx
, если возникнет подобная запутанная ситуация, то не стесняйтесь обращаться напрямую к монорепозиторию, к нему легко получить доступ, но это просто аутсорсинг.
yarn workspace
рынокmonorepo
Решений много, самое популярноеyarn workspace
+ lerna
, ведь две новые ямыvue3
а такжеelement+
Это тоже делается, еще с точки зрения решения задачи, посмотрите на следующееworkspace
Что это может нам принести? я правyarn
Пример с официального сайта расширен:
root
|---package.json
|———packages/
|
|————workspace-a/
|---node_modules/
|---package.json
|
|————workspace-b/
|---node_modules/
|---package.json
// workspace-a/package.json:
{
"name": "workspace-a",
"version": "1.0.0",
"dependencies": {
"cross-env": "5.0.5"
}
}
// workspace-b/package.json:
{
"name": "workspace-b",
"version": "1.0.0",
"dependencies": {
"cross-env": "5.0.5",
"dotEnv": "1.0.0",
"workspace-a": "1.0.0"
}
}
Вышеупомянутые два независимых проекта, мы находимся вworkspace-b
серединаrequire dotEnv
,существуетworkspace-a
серединаrequire b
, теперь выдает ошибку, потому чтоworkspace-a
Нет вdotEnv
раствор, вroot
изpackage.json
Добавить:
{
"private": true,
"workspaces": ["workspace-a", "workspace-b"]
}
private - запретить публикацию корневой папки,workspace
это назначенное рабочее пространство
yarn
положит["workspace-a", "workspace-b"]
Зависимости dep автоматически устанавливаются наroot
, а с инжинирингом подnode_modules
Сделайте сопоставление и внедритеsyslink
, по сути, это тоже можно понимать как ссылку на корневую директорию, и в то же время в корневую директориюnode_modules
Также будет два пакета вworkspace-a
а такжеworkspace-b
, так как ссылка идет в корень, поэтому меняемworkspace-a
файл в ,node_modules
Файлы ниже тоже изменятся, только представьте, что один из моих модулей ставитсяcommon ui组件
Да, остальныеa b c d ...
Модули - это бизнес-модули, мне просто нужно что-то вродеimport ui from 'common-ui'
В частности, благословляя ts, и не заботясь о ссылочном пути, Unity Projectnode_modules
Модуль может быть.
если неworkspace
, нужно многоnpm link
, слишком много пакетов теряют управляемость.
lerna
так многоyarn workspace
, кажется, что наша болевая точка была решена, чтоlerna
Какую роль делать?
Этоlerna
Коллекция команд в основном безвкусна:
lerna bootstrap 安装依赖
lerna clean 删除各个包下的node_modules
lerna init 创建新的lerna库
lerna list 显示package列表
lerna changed 显示自上次relase tag以来有修改的包,选项通 list
lerna diff 显示自上次relase tag以来有修改的包的差异,执行 git diff
lerna exec 在每个包目录下执行任意命令
lerna run 执行每个包package.json中的脚本命令
lerna add 添加一个包的版本为各个包的依赖
lerna import 引入package
lerna link 链接互相引用的库
lerna create 新建package
lerna publish 发布
lerna
а такжеyarn workspace
Некоторые функции действительно повторяются, ведь естьlerna
позжеyarn workspace
, так как путаница управления проектами может быть решена, каждый пакет может быть отдельной библиотекой модулей, мы можем использоватьlerna
Для сборки и публикации проекта конфигурация также очень проста:
cd root
yarn add lerna
touch lerna.json
// lerna.json
{
"packages": ["packages/*"],
"npmClient": "yarn",
"useWorkspaces": true,
"command": {
"create": {
"homepage": "https://github.com/lerna/lerna",
"license": "MIT"
},
"version": {
"allowBranch": "main",
"conventionalCommits": true,
"exact": true,
"message": "chore(release): %s"
}
},
"version": "0.0.0"
}
// package.json
{
"scripts": {
"bootstrap": "lerna bootstrap",
"build": "lerna run build",
"publish": "lerna publish --yes from-package"
}
...
}
Мы предпочитаем устанавливать lerna под root, как указано выше.npm script
затем бегиyarn bootstrap
, он будет установлен автоматическиworkspace
Зависимости в , такие же как и в direct yarn, но за счет кеширования скорость установки быстрее чемyarn
Гораздо быстрее, то же самое вышеworkspace
Публичные возможности, мы будем использовать большеlerna
возможность публиковать, запускатьyarn publish
, который делает следующее:
- бегать
lerna updated
решить, какой пакет необходимо опубликовать - При необходимости обновим версию в lerna.json
- Обновите поле версии package.json во всех обновленных пакетах.
- Обновить зависимости во всех обновленных пакетах
- Создайте git commit или тег для новой версии
- Опубликуйте пакет в npm (не обязательно npm или частный склад), добавьте адрес конфигурации опции publishConfig.registry в package.json
Вышеупомянутое относительно грубоmonorepo
Практичный, очень подходящий для решений интеграции инструментов узла, библиотек пользовательского интерфейса и т. д. Сейчас почти все крупные проекты с открытым исходным кодом используют режим управления пакетами, поэтому при написании проектов вы тоже учитываете предыдущую волну?