Воркспейсы
pnpm имеет встроенную поддержку монорепозиториев (multi-package репозиториев, multi-project репозиториев или монолитных репозиториев). Можно создать рабочую область для объединения нескольких проектов в одном репозитории.
A workspace must have a pnpm-workspace.yaml
file in its
root. A workspace also may have an .npmrc
in its root.
If you are looking into monorepo management, you might also want to look into Bit.
Bit использует pnpm под капотом, но автоматизирует многие вещи, которые в настоящее время выполняются вручную в традиционной рабочей области, управляемой pnpm/npm/Yarn. There's an article about bit install
that talks about it: Painless Monorepo Dependency Management with Bit.
Протокол рабочей области (workspace:)
If link-workspace-packages is set to true
, pnpm will link packages from the workspace if the available packages
match the declared ranges. For instance, foo@1.0.0
is linked into bar
if
bar
has "foo": "^1.0.0"
in its dependencies and foo@1.0.0
is in the workspace. However, if bar
has
"foo": "2.0.0"
in dependencies and foo@2.0.0
is not in the workspace,
foo@2.0.0
will be installed from the registry. Такое поведение вносит некоторую неопределенность.
Luckily, pnpm supports the workspace:
protocol. Когда используется этот протокол, pnpm откажется разрешать что- либо, кроме пакета локальной рабочей области. So, if you set "foo": "workspace:2.0.0"
, this time
installation will fail because "foo@2.0.0"
isn't present in the workspace.
This protocol is especially useful when the link-workspace-packages option is
set to false
. In that case, pnpm will only link packages from the workspace if
the workspace:
protocol is used.
Ссылки на пакеты рабочей области через псевдонимы
Let's say you have a package in the workspace named foo
. Usually, you would
reference it as "foo": "workspace:*"
.
If you want to use a different alias, the following syntax will work too:
"bar": "workspace:foo@*"
.
Перед публикацией псевдонимы конвертируются в обычные алиасные зависимости. The above
example will become: "bar": "npm:foo@1.0.0"
.
Ссылка на пакеты рабочей области через их относительный путь
В рабочей области с 2 пакетами:
+ packages
+ foo
+ bar
bar
may have foo
in its dependencies declared as
"foo": "workspace:../foo"
. Перед публикацией эти спецификации преобразуются в спецификации обычных версии, поддерживаемые всеми менеджерами пакетов.
Публикация пакетов рабочей области
When a workspace package is packed into an archive (whether it's through
pnpm pack
or one of the publish commands like pnpm publish
), we dynamically
replace any workspace:
dependency by:
- The corresponding version in the target workspace (if you use
workspace:*
,workspace:~
, orworkspace:^
) - Связанный диапазон semver (для любого другого типа диапазона)
So for example, if we have foo
, bar
, qar
, zoo
in the workspace and they all are at version 1.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, read this page.
For using Changesets with pnpm, read this guide.
Решение проблем
pnpm не может гарантировать, что скрипты будут запущены в топологическом порядке, если между зависимостями рабочей области есть циклы. Если pnpm обнаруживает циклические зависимости во время установки, будет выведено предупреждение. Если pnpm может выяснить, какие зависимости вызывают циклы, то они также будут отображены.
If you see the message There are cyclic workspace dependencies
, please inspect workspace dependencies declared in dependencies
, optionalDependencies
and devDependencies
.
Примеры использования
Вот несколько наиболее популярных проектов с открытым исходным кодом, которые используют функцию рабочего пространства pnpm: