Все еще теряете волосы из-за монорепо? Пряжа 2.0 для понимания

Yarn
Все еще теряете волосы из-за монорепо? Пряжа 2.0 для понимания

YarnКак мощный инструмент управления экологическими зависимостями JavaScript в этом году24 январяКогда версия v2 была официально выпущена. В этой статье я познакомлю вас со следующим:

Getting StartedMigrations.

Зачем разрабатывать версию v2

Основанная в начале 2016 года, Yarn в начале многое позаимствовала у npm, да и сам дизайн архитектуры не очень соответствовал видению разработчиков Yarn. После этого Yarn добавил много новых функций в течение следующих нескольких лет, в том числе Workspaces (2017), Plug'n'Play (2018) и Zip-загрузку (2019), из-за постоянных новых требований. Этих новых концепций не существовало, когда Yarn только создавался, поэтому дизайн архитектуры Yarn не учитывал добавление этих новых функций в будущем, поэтому со временем код Yarn становился все труднее поддерживать и расширять. По этой технической причине Yarn нуждалась в более современной структуре кода, чтобы соответствовать новым требованиям.

Поощряйте разработчиков вносить свой код

Как общественный проект Yarn придерживается одной из концепций:we don't want to work for you, we want to work with you. Из этого видно, что разработчики пряжи на самом деле надеются, что больше разработчиков будут участвовать в разработке этого проекта, а не только их поддерживать. Чтобы понизить порог для разработчиков, чтобы вносить код в проект пряжи, версия пряжи V2 сделала следующие изменения:

  • Поток в миграцию из более популярного Teamprctry в качестве языка разработки, чтобы разработчики могли использовать, чтобы стать более знакомой с помощью технологического стека, чтобы вносить вклад код.
  • Модульная архитектура кода, основанная на подключаемом модуле (Plugin), позволяет разработчикам добавлять в Yarn новые функции путем реализации подключаемых модулей без понимания основного кода Yarn. Более того, основные функции Yarn также реализуются с помощью различных встроенных плагинов, что полностью совпадает с дизайнерской идеей Webpack, поэтому разработчики могут легко понять, как реализована каждая функция.

Что нового в v2

После разговора о том, почему была разработана версия v2, давайте посмотрим, какие новые функции в ней есть.

Более читаемый журнал вывода

Хотя выходной журнал Yarn более удобочитаем, чем другие альтернативы (такие как npm), у него все еще есть различные проблемы, например, когда много выходной информации, разработчикам сложно найти полезный контент в большом количестве выходов. , а цвет выводимого лога не помогает пользователям быстро идентифицировать важную информацию, и даже мешает читать лог. По этим причинам в версии v2 были внесены некоторые улучшения в журнал вывода, давайте посмотрим, как он примерно выглядит:

Из приведенного выше вывода мы видим, что в начало каждой строки журнала добавляется код ошибки (код ошибки) Значение различных кодов ошибок можно найти в этомДокументациянайти в. Эти номера ошибок позволяют разработчикам быстро находить ошибки и упрощают поиск исправлений. В дополнение к новому номеру ошибки, журнал вывода также был значительно улучшен в цвете.Например, в приведенном выше выводе будут использоваться яркие цвета для выделения имени зависимости и номера ее версии, что облегчает разработчикам получение полезной информации. Информация.

Yarn dlx

yarn dlxфункция иnpxаналогичный. длкс этоdownload and executeСокращенно от , эта команда создаст временную локальную среду для загрузки указанной зависимости. После завершения загрузки зависимости она выполнит исполняемый двоичный файл, содержащийся в зависимости, в текущем рабочем каталоге (cwd). Это временное пространство будет удалено. после завершения команды, поэтому все эти операции одноразовые.

yarn dlxЭта команда не изменит содержимое package.json текущего проекта и может выполнять только удаленные сценарии, но не локальные (локальные сценарии могут выполняться с помощью yarn run), поэтому она имеет более высокий уровень безопасности, чем npx sex.

Поскольку версия v2 включена по умолчаниюPlug'n'Playфункция, когда вы используете его один разyarn dlxПосле того, как команда выполнит удаленный скрипт, зависимости скрипта будут закешированы в локальном окружении, так что при повторном выполнении ей не нужно скачивать зависимости, так он станет быстрее.

Лучшие рабочие пространства поддерживают

Одним из самых больших изменений в версии V2 являетсяworkspacesстать первоклассным гражданином, чтобы лучше поддерживатьmonorepoРазвитый. v2版本对workspaces的支持体现在以下这些方面:

Если вы хотите ввести определенную зависимость в Workspace в проекте, вам, возможно, придется подумать, используют ли другие Workspace эту зависимость, и избегать введения несовместимых версий. Вы можете использовать версию V2, вы можете использовать-iпараметр, чтобы позволитьyarn addКоманда переходит в интерактивный режим, поэтому yarn проверит для вас, используется ли зависимость в других рабочих областях, и позволит вам выбрать, следует ли повторно использовать версию зависимости в других рабочих областях или использовать другую версию.

Обновите все рабочие области зависимости

В версии v2 добавлен новыйyarn upЗаказ. эта команда иyarn upgradeКоманды похожи, все они используются для обновления версии зависимости. а такжеyarn upgradeРазница в том, что он может обновлять версию зависимости во всех рабочих областях одновременно, вместо того, чтобы переключаться на каждую рабочую область для запуска команды обновления. Эта команда также имеет интерактивный режим-iПозвольте вам подтвердить конкретные операции, выполняемые в разных рабочих областях.

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

Студенты, участвовавшие в разработке монорепозитория, наверняка сталкивались с такой проблемой: при выпуске новой версии пакета (рабочей области) очень проблематично выпустить другие родственные пакеты. Если вы используете в своем проектеLernaКогда вы выпускаете новую версию пакета, либо все пакеты выпускают новую версию, либо вам приходится вручную управлять выпусками других пакетов. Хотя ему удалось опубликовать другие пакеты, это также возможно, но рукотворные вещи, безусловно, небрежность, но и больше, чем головная боль, совместный проект сделает людей. Чтобы решить эту проблему, версия Yarn v2 приняла, а Lerna и другие подобные инструменты - совершенно другое решение, которое поместило логику в отдельный раздел под названиемверсия плагинасередина. Плагин версии позволяет вам распределять часть работы над версиями пакета среди участников вашего кода, а также предоставляет удобный интерфейс, который позволяет вам легко управлять выпуском связанных пакетов:

Выполнение одной и той же команды в нескольких рабочих областях

Очень распространено для запуска той же команды в разных рабочих пространствах одного и того же проекта, пряжа V2 обеспечивает новыйyarn workspaces foreachКоманда позволяла запустить ту же команду в нескольких рабочих пространствах, эта команда встроена в нее.

yarn workspaces foreach run build

Иногда вы хотите, чтобы все рабочие области одного и того же проекта следовали определенным правилам, например.所有的workspaces都不能使用underscore作为依赖или所有workspaces依赖的某个包版本要互相兼容Ждать. Версия v2 имеет новую концепцию под названиемограничение(Ограничения), ограничения здесь для каждой рабочей области в проектеpackage.jsonПосле ограничения, как ограничения ESLINT файла JS, поскольку он уничтожит некоторые правила в рабочих пространствах Package.json Дайте вам сообщение об ошибке и можем помочь вам исправить часть ошибки.

Правила ограничения пряжиPrologграмматику писать. Чтобы добавить ограничения в ваши рабочие области, вам сначала нужно импортироватьconstraintsПлагин:

yarn plugin import constraints

Затем определите правило ограничения хранилища в корневом каталоге проекта.constraints.proфайл и, наконец, определите ограничения, которые вы хотите в этом файле.Например, следующие ограничения запрещают всем рабочим пространствам использовать подчеркивание в качестве зависимости:

gen_enforced_dependency(WorkspaceCwd, 'underscore', null, DependencyType) :-
  workspace_has_dependency(WorkspaceCwd, 'underscore', _, DependencyType).

После определения правил ограничений их можно использовать.yarn constraints checkкоманды workspaces для проверки соответствия проекта определению правил ограничения, когда возникает ошибка, вы можете использоватьyarn constraints fixКоманда автоматически исправляет ошибки, которые могут быть исправлены автоматически.

Запрос зависимостей рабочих областей, таких как база данных

yarn constraints queryКоманда может запросить информацию о зависимости, используемую рабочими областями в проекте.Например, следующая команда выведет информацию о версии lodash, используемую каждой рабочей областью:

$my-project: yarn constraints query "workspace_has_dependency(Cwd, 'lodash', Range, _)."
➤ YN0000: ┌ Cwd   = 'packages/backend'
➤ YN0000: └ Range = '4.17.0'
➤ YN0000: ┌ Cwd   = 'packages/frontend'
➤ YN0000: └ Range = '4.17.0'
➤ YN0000: Done with warnings in 0.03s

Лично я считаю, что приведенный выше зависимый запрос очень похож на запрос к базе данных с помощью синтаксиса SELECT в базе данных MySQL, что является очень мощной и полезной функцией.

Нулевая установка зависимостей

Зависимость нулевой установкуБольше похоже на концепцию, чем на функцию, идея состоит в том, чтобы надеяться, что каждый раз, когда мы обновляем код с помощью git, нам не нужно использовать его снова.yarn install

  • Лучший опыт развития
    • каждый раз, когда вы используетеgit pull, git checkout, git rebaseВам не нужно использовать эти команды после обновления кодаyarn installУстановите зависимости, что позволит избежать некоторых проблем, например, после того, как кто-то другой обновит версию зависимости, если вы не выполните соответствующее обновление, ваш код зависнет.
    • При рассмотрении кода становится понятным, какие зависимости изменились.
  • Более быстрое, простое и стабильное развертывание CI
    • Поскольку каждый раз, когда код развертывается,yarn installЗатраченное время является большим, и скорость развертывания будет значительно улучшена после удаления этого шага.
    • Не будет проблем с локальной работой, и проблемы зависания при публикации онлайн среды.
    • Вам не нужно выполнять какую-либо зависящую от установки настройку в файле CI.

Студенты, которые хотят увидеть фактический эффект загрузки pnp + zip, могут взглянуть на версию yarn v2.код, вы можете видеть, что он находится в собственном репозитории.yarn/cacheВ каталоге хранятся все его зависимости:

новое соглашение

Yarn v2 добавляет два новых протокола:patchа такжеportalпротокол. Студенты, которые не знают, что такое соглашение, могут посмотреть на официальном сайтепредставлятьВероятно, он использовался для того, чтобы сообщить пряже, как определить, какой из файлов package.json анализируется.

Патч соглашение

Наша ежедневное развитие иногда необходимо изменить зависимость от исходного кода, чтобы сделать некоторые экспериментальные вещи, на этот раз мы можем использовать этот патч протокол. Давайте посмотрим, как использовать:

{
  "dependencies": {
    "left-pad": "patch:left-pad@1.3.0#./my-patch.patch"
  }
}

Определено выше Package.json.left-pad./my-patch.patchЭтот патч, так называемый патч, является нашим собственным изменением кода библиотеки left-pad, аналогичного файлу git diff.

Протокол портала

Протокол портала аналогичен исходному протоколу ссылки. Его функция состоит в том, чтобы указать зависимости в проекте yarn на мягкую ссылку (символическую ссылку) в локальной файловой системе, что на самом деле похоже на функцию ссылки на yarn. В отличие от протокола ссылок портал указывает на какие-то пакеты, то есть на папку с файлом package.json, и yarn будет разбирать транзитивные зависимости в этом пакете. Для более конкретных различий между протоколом портала и протоколом ссылки см.официальная документация.

Сценарий нормализованной оболочки (Normalized shell)

Версия v2 лучше совместима со средой разработки Windows. Возможно, вы сталкивались с такой проблемой раньше: команда сценария, определенная вами в package.json, работает в системе OSX, но сообщает об ошибке на компьютере с Windows. Причина этой проблемы заключается в том, что сценарий, который вы определяете в package.json, в конечном итоге выполняется путем создания подпроцесса через Yarn, а среда оболочки подпроцесса отличается в средах Windows и OSX (например, путь к файлу не записывается по-разному .то же). Чтобы решить эту проблему, Yarn v2 поставляется с простым синтаксическим анализатором оболочки (интерпретатором). Определенный сценарий оболочки может нормально работать как в среде Windows, так и в среде OSX с совместимостью с этим синтаксическим анализатором:

{
  "scripts": {
    "redirect": "node ./something.js > hello.md",
    "no-cross-env": "NODE_ENV=prod webpack"
  }
}

Модульная архитектура кода

Как упоминалось ранее, Yarn v2 был преобразован в модульную архитектуру и поддерживает определяемые пользователем плагины для расширения своей функциональности. Определяемые пользователем плагины могут получать информацию о дереве зависимостей, проанализированную Yarn, и некоторую другую контекстную информацию, поэтому легко реализовать некоторые вещи, такие какLerna,Femotoа такжеPatch-Packageбиблиотека.

Студенты, которые хотят почувствовать, как реализован плагин Yarn, могут взглянуть на официальную реализацию.плагин машинописного текста. Этот плагин машинописного текста очень полезен для студентов, которые разрабатывают с помощью Typescript, его можно использовать в вашихyarn addКоманда добавления также зависит от того, когда добавлять соответствующий зависимый@types/руководство.

другие обновления

В дополнение к новым свойствам, упомянутым выше, версия v2 имеет следующие обновления:

  • Также можно использовать одноранговые зависимости, в которых ссылка на пряжу
  • Формат файла блокировки изменен на стандартный формат YAML.
  • Нормализованный файл конфигурации
  • ...

Друзья, которые хотят увидеть все обновления в версии v2, могут прочитать статью Маэля Нисона -Introducing Yarn 2или проверить это непосредственноchange log.

Планы пряжи на будущее

  • V1 Последняя версия V1.22 была освобождена от этого автора не добавит какие-либо новые функции в коде V1. Пряжа Все новые функции будут развиваться только на версии кодовой базы V2.
  • Репозиторий v1 будет перемещен изyarnpkg/yarnпереехал вyarnpkg/legacy, этот репозиторий будет оставаться открытым в течение определенного периода времени для исправления некоторых ошибок, а затем это будет достигнуто через год или два. Версия кода v2 не будет перенесена из-за устаревших проблем.yarnpkg/yarn, и останется вyarnpkg/berry.
  • Официальный сайт v1 будет перенесен на legacy.yarnpkg.com, а контент официального сайта yarnpkg.com уже является контентом версии v2 next.yarnpkg.com.
  • В репозитории npm,legacyТочки этикеток V1 - последняя версия кода,latestТеги будут по-прежнему указывать на последнюю версию кода для версии 1 в течение нескольких недель, а затем на код для версии 2.berryТеги всегда будут указывать на последнюю версию версии v2.
  • Вероятно, в апреле этого года,Образы Docker для Node 14 могут поставляться с v2 по умолчаниюТаким образом, вы можете использовать функции v2 прямо в контейнере.

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

Тенденции в области персональных технологий

Статья впервые опубликована в

Добро пожаловать в публичный аккаунтатакующий лукучиться и расти вместе