Рабочие пространства
Рабочие пространства Yarn предназначены для упрощения работы с монорепозиториями, решая одну из основных задач использования yarn link более декларативным способом. Короче говоря, они позволяют нескольким проектам существовать вместе в одном репозитории и ссылаться друг на друга — любые изменения в исходном коде одного проекта мгновенно применяются к другим.
Прежде всего, немного терминологии: в контексте функции рабочих пространств, проект — это всё дерево каталогов, составляющее ваши рабочие пространства (часто сам репозиторий). Рабочее пространство — это локальный пакет, созданный из ваших собственных источников из этого проекта. Наконец, рабочая область — это имя, присваиваемое рабочим пространствам, которые перечисляют свои дочерние рабочие пространства. Проект содержит одну или несколько рабочих областей, которые могут содержать любое количество рабочих пространств. Любой проект содержит по крайней мере одно рабочее пространство: корневое.
Как объявить рабочую область?
Рабочие области определяются через традиционные файлы package.json. Что делает их особенными, так это следующие свойства:
Они должны объявлять поле
workspaces, которое должно быть массивом шаблонов glob, которые должны использоваться для поиска рабочих пространств, составляющих рабочую область. Например, если вы хотите, чтобы все папки внутри папкиpackagesбыли рабочими пространствами, просто добавьтеpackages/*в этот массив.Они должны быть каким-то образом связаны с файлом уровня проекта
package.json. В типичной настройке рабочих пространств это не имеет значения, поскольку обычно в файле проектаpackage.jsonопределена единственная рабочая область, но если вы пытаетесь настроить вложенные рабочие пространства, то должны убедиться, что вложенная рабочая область определена как допустимое рабочее пространство своего родительского рабочего пространства (иначе Yarn не найдёт правильную родительскую папку).
Обратите внимание, что поскольку рабочие области определяются с помощью обычного файла package.json, они также являются допустимыми рабочими пространствами сами по себе. Если они имеют имена, другие рабочие пространства смогут должным образом ссылаться на них.
Примечание
Раньше рабочие области должны были быть закрытыми (т. е. список
"private": trueв их файле package.json). Это требование было удалено с выпуском 2.0, чтобы помочь автономным проектам постепенно перейти на рабочие пространства (например, указав веб-сайт документации как отдельное рабочее пространство).
Что значит быть рабочим пространством?
Рабочие пространства имеют два важных свойства:
Доступны только те зависимости, от которых зависит рабочее пространство. Другими словами, мы строго контролируем зависимости ваших рабочих пространств. Это позволяет нам чётко разделить проекты друг от друга, так как вам не нужно объединять все их зависимости в один огромный и неподдерживаемый список. Мы по-прежнему предоставляем инструменты для управления зависимостями из нескольких рабочих пространств одновременно, но они должны быть явно использованы и предлагают лучшую интеграцию (например,
yarn addможет давать предложения по вашим новым зависимостям на основе того, что используют другие рабочие пространства, но вы можете их переопределить).Если менеджер пакетов должен разрешить диапазон, который может удовлетворить рабочее пространство, он предпочтёт разрешение рабочего пространства перед удалённым разрешением, если это возможно. Это основа подхода монорепозитория: вместо использования удалённых пакетов из репозитория, пакеты вашего проекта будут взаимосвязаны и будут использовать код, хранящийся в вашем репозитории.
Диапазоны рабочих пространств (workspace:)
Хотя Yarn автоматически выбирает разрешения рабочих пространств, когда они совпадают, бывают моменты, когда вы абсолютно не хотите рисковать использованием пакета из удалённого репозитория, даже если версии не совпадают (например, если ваш проект не предназначен для публикации, и вы просто хотите использовать рабочие пространства для лучшей компартментализации кода).
Для таких случаев Yarn теперь поддерживает новый протокол разрешения, начиная с версии 2: workspace:. При использовании этого протокола Yarn откажется от разрешения на всё, кроме локальных рабочих пространств. Этот протокол диапазонов имеет два варианта:
- Если это диапазон semver, он выберет рабочее пространство, соответствующее указанной версии.
- Если это путь, относящийся к проекту, он выберет рабочее пространство, соответствующее этому пути (экспериментальная функция).
Обратите внимание, что второй вариант экспериментальный, и мы рекомендуем воздержаться от его использования на данный момент, так как некоторые детали могут измениться в будущем. Наша текущая рекомендация — использовать workspace:*, что почти всегда сделает то, что вы ожидаете.
Публикация рабочих пространств
Когда рабочее пространство упаковывается в архив (будь то через yarn pack или одну из команд публикации, таких как yarn npm publish), мы динамически заменяем любую зависимость workspace: на:
- Соответствующую версию в целевом рабочем пространстве (если вы используете
*,^,~, или путь, относящийся к проекту) - Связанный диапазон semver (для любого другого типа диапазона)
Например, если предположить, что у нас есть следующие рабочие пространства, текущая версия которых 1.5.0, то следующее:
{
"dependencies": {
"star": "workspace:*",
"caret": "workspace:^",
"tilde": "workspace:~",
"range": "workspace:^1.2.3",
"path": "workspace:path/to/baz"
}
}Преобразуется в:
{
"dependencies": {
"star": "1.5.0",
"caret": "^1.5.0",
"tilde": "~1.5.0",
"range": "^1.2.3",
"path": "1.5.0"
}
}Эта функция позволяет вам не зависеть ни от чего, кроме ваших локальных рабочих пространств, при этом сохраняя возможность публикации полученных пакетов в удалённый репозиторий без необходимости выполнения промежуточных шагов публикации — ваши потребители смогут использовать ваши опубликованные рабочие пространства как любой другой пакет, всё ещё получая гарантии, которые предлагает semver.
Рабочие пространства Yarn против Lerna
Несмотря на внешние признаки, Yarn рабочие пространства и Lerna не конкурируют. На самом деле, Lerna будет использовать рабочие пространства Yarn, если это возможно. В некотором смысле, Lerna можно рассматривать как высокоуровневый слой поверх низкоуровневой реализации Yarn.
© 2016–present Yarn Contributors
Licensed under the BSD License.
https://v3.yarnpkg.com/features/workspaces