Воркспейсы
pnpm имеет встроенную поддержку монорепозиториев (multi-package репозиториев, multi-project репозиториев или монолитных репозиториев). Можно создать рабочую область для объединения нескольких проектов в одном репозитории.
Рабочая область должна иметь файл pnpm-workspace.yaml
в корневом каталоге. Рабочая область также может иметь .npmrc
в корне.
Если вы изучаете управление монорепозиторием, вы также можете заглянуть в Bit. Bit использует pnpm под капотом, но автоматизирует многие вещи, которые в настоящее время выполняются вручную в традиционной рабочей области, управляемой pnpm/npm/Yarn. Есть статья о bit установке
, в которой говорится об этом: Безболезненное управление зависимостями монорепозитория с Bit.
Протокол рабочей области (workspace:)
По умолчанию pnpm будет связывать пакеты из рабочей области, если доступные пакеты соответствуют объявленным диапазонам. Например, foo@1.0.0
связывается с bar
если bar
имеет в своих зависимостях "foo": "^1.0.0"
и foo@1.0.0
находится в рабочей области. Однако, если bar
имеет "foo": "2.0.0"
в зависимостях и foo@2.0.0
не находится в рабочей области, foo@2.0.0
будет установлен из реестра. Такое поведение вносит некоторую неопределенность.
К счастью, pnpm поддерживает протокол workspace:
. Когда используется этот протокол, pnpm откажется разрешать что-либо, кроме пакета локальной рабочей области. Итак, если вы установите "foo": "workspace:2.0.0"
, на этот раз установка завершится ошибкой, поскольку "foo@2.0.0"
отсутствует в рабочей области.
Этот протокол особенно полезен, когда для параметра link-workspace-packages установлено значение false
. В этом случае pnpm будет связывать пакеты из рабочей области только, если используется протокол workspace:
.
Ссылки на пакеты рабочей области через псевдонимы
Допустим, у вас есть пакет в рабочей области с именем foo
. Обычно вы бы сослались на него как "foo": "workspace:*"
.
Если вы хотите использовать другой псевдоним, следующий синтаксис также будет работать: "bar": "workspace:foo@*"
.
Перед публикацией псевдонимы конвертируются в обычные алиасные зависимости. Приведенный выше пример станет следующим: "bar": "npm:foo@1.0.0"
.
Ссылка на пакеты рабочей области через их относительный путь
В рабочей области с 2 пакетами:
+ packages
+ foo
+ bar
bar
может иметь foo
в своих зависимостях, объявленных как "foo": "workspace:../foo"
. Перед публикацией эти спецификации преобразуются в спецификации обычных версии, поддерживаемые всеми менеджерами пакетов.
Публикация пакетов рабочей области
Когда пакет рабочей области упакован в архив (будь то через pnpm pack
или одну из команд публикации, например pnpm publish
), мы динамически заменяем любую зависимость workspace:
на:
- Соответствующую версию в целевой рабочей области (если вы используете
workspace:*
,workspace:~
илиworkspace: ^
) - Связанный диапазон semver (для любого другого типа диапазона)
Так, например, если у нас есть foo
, bar
, qar
, zoo
в рабочей области, и все они имеют версию 1.5.0
, то:
{
"dependencies": {
"foo": "workspace:*",
"bar": "workspace:~",
"qar": "workspace:^",
"zoo": "workspace:^1.5.0"
}
}
Будет преобразован в:
{
"dependencies": {
"foo": "1.5.0",
"bar": "~1.5.0",
"qar": "^1.5.0",
"zoo": "^1.5.0"
}
}