Воркспейсы
pnpm имеет встроенную поддержку монорепозиториев (multi-package репозиториев, multi-project репозиториев или монолитных репозиториев). Можно создать рабочую область для объединения нескольких проектов в одном репозитории.
A workspace must have apnpm-workspace.yaml
file in itsroot.
If you are looking into monorepo management, you might also want to look intoBit.Bit использует pnpm под капотом, но автоматизирует многие вещи, которые в настоящее время выполняются вручную в традиционной рабочей области, управляемой pnpm/npm/Yarn. There's an article aboutbit install
that talks about it:Painless Monorepo Dependency Management with Bit.
Протокол рабочей области (workspace:)
IflinkWorkspacePackages is set totrue
, pnpm will link packages from the workspace if the available packagesmatch the declared ranges. For instance,foo@1.0.0
is linked intobar
ifbar
has"foo": "^1.0.0"
in its dependencies andfoo@1.0.0
is in the workspace. However, ifbar
has"foo": "2.0.0"
in dependencies andfoo@2.0.0
is not in the workspace,foo@2.0.0
will be installed from the registry. Такое поведение вносит некоторую неопределенность.
Luckily, pnpm supports theworkspace:
protocol. Когда ис пользуется этот протокол, pnpm откажется разрешать что-либо, кроме пакета локальной рабочей области. So, if you set"foo": "workspace:2.0.0"
, this timeinstallation will fail because"foo@2.0.0"
isn't present in the workspace.
This protocol is especially useful when thelinkWorkspacePackages option isset tofalse
. In that case, pnpm will only link packages from the workspace iftheworkspace:
protocol is used.
Ссылки на пакеты рабочей области через псевдонимы
Let's say you have a package in the workspace namedfoo
. Usually, you wouldreference it as"foo": "workspace:*"
.
If you want to use a different alias, the following syntax will work too:"bar": "workspace:foo@*"
.
Перед публикацией псевдонимы конвертируются в обычные алиасные зависимости. The aboveexample will become:"bar": "npm:foo@1.0.0"
.
Ссылка на пакеты рабочей области через их относительный путь
В рабочей области с 2 пакетами:
+ packages
+ foo
+ bar
bar
may havefoo
in its dependencies declared as"foo": "workspace:../foo"
. Перед публикацией эти спецификации преобразуются в спецификации обы чных версии, поддерживаемые всеми менеджерами пакетов.
Публикация пакетов рабочей области
When a workspace package is packed into an archive (whether it's throughpnpm pack
or one of the publish commands likepnpm publish
), we dynamicallyreplace anyworkspace:
dependency by:
- The corresponding version in the target workspace (if you use
workspace:*
,workspace:~
, orworkspace:^
) - Связанный диапазон semver (для любого другого типа диапазона)
So for example, if we havefoo
,bar
,qar
,zoo
in the workspace and they all are at version1.5.0
, the following:
{
"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"
}
}
Эта функция позволяет вам использовать локальные пакеты в рабочей области, при этом публиковать собранные пакеты в удаленном реестре без дополнительных промежуточных шагов - ваши потребители смогут использовать ваши опубликованные рабочие пространства как любой другой пакет, при этом сохраняя гарантии, которые предлагает семантическое версионирование.
Процесс выпуска пакетов
Управление версиями пакетов внутри рабочей области — сложная задача, и pnpm в настоящее время непредоставляет для нее встроенного решения. Однако, есть 2 хорошо протестированных инструмента, которые позволяют управляют версионированием и поддерживают pnpm:
For how to set up a repository using Rush, readthis page.
For using Changesets with pnpm, readthis guide.
Решение проблем
pnpm не может гарантировать, что скрипты будут запущены в топологическом порядке, если между зависимостями рабочей области есть циклы. Если pnpm обнаруживает циклические зависимости во время установки, будет выведено предупреждение. Если pnpm может выяснить, какие зависимости вызывают циклы, то они также будут отображены.
If you see the messageThere are cyclic workspace dependencies
, please inspect workspace dependencies declared independencies
,optionalDependencies
anddevDependencies
.
Примеры использования
Вот несколько наиболее популярных проектов с открытым исходным кодом, которые используют функцию рабочего пространства pnpm: