Интерфейсный проект становится больше, попробуйте монорепозиторий

Node.js
Интерфейсный проект становится больше, попробуйте монорепозиторий

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