Робочий простір

pnpm має вбудовану підтримку монорепозиторіїв (також відомих як репозиторії з декількома пакунками, репозиторії з декількома проєктами або монолітні репозиторії). Ви можете створити робочий простір, щоб обʼєднати кілька проєктів в одному репозиторії.

Робоча область повинна мати файл pnpm-workspace.yaml у корені.

підказка

Якщо ви розглядаєте управління монорепозиторіями, ви також можете розглянути Bit. Bit використовує pnpm під капотом, але автоматизує багато речей, які зараз виконуються вручну в традиційному робочому просторі, керованому pnpm/npm/Yarn. Є стаття про bit install, яка розповідає про це: Безболісне керування залежностями Monorepo за допомогою Bit.

Протокол робочого простору (workspace:)#

Якщо linkWorkspacePackages встановлено у true, 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" у робочому просторі відсутній.

Цей протокол особливо корисний, коли параметр linkWorkspacePackages має значення 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:~ або workspace:^)
  • Асоційований діапазон Semver (для будь-якого іншого типу діапазону)

Порожній workspace: без діапазону версій розглядається як workspace:*.

Наприклад, якщо у робочому просторі є foo, bar, qar, zoo і всі вони мають версію 1.5.0, то наступне:

package.json
{
	"dependencies": {
		"foo": "workspace:*",
		"bar": "workspace:~",
		"qar": "workspace:^",
		"zoo": "workspace:^1.5.0"
	}
}

Буде перетворено на:

package.json
{
	"dependencies": {
		"foo": "1.5.0",
		"bar": "~1.5.0",
		"qar": "^1.5.0",
		"zoo": "^1.5.0"
	}
}

Ця функція дозволяє вам покладатися на ваші локальні пакунки робочих просторів і водночас публікувати отримані пакунки у віддаленому реєстрі без проміжних кроків публікації — ваші користувачі зможуть використовувати ваші опубліковані робочі простори як будь-які інші пакунки, отримуючи вигоду від гарантій, що їх пропонує Semver.

Процес релізу#

pnpm versions and releases workspace packages with pnpm change and pnpm version -r. See Release management.

These external tools also handle versioning and support pnpm:

Щоб дізнатися, як налаштувати сховище за допомогою Rush, прочитайте цю сторінку.

Про використання Changesets з pnpm читайте в цьому посібнику.

Усунення несправностей#

pnpm не може гарантувати виконання скриптів у топологічному порядку, якщо між залежностями робочого простору є цикли. Якщо pnpm виявить циклічні залежності під час встановлення, він видасть попередження. If pnpm can find out which dependencies are causing the cycles, it will display them too.

If you see the message There are cyclic workspace dependencies, inspect workspace dependencies declared in dependencies, optionalDependencies and devDependencies.

Workspaces in the wild#

Ось декілька найпопулярніших відкритих проєктів, які використовують функцію робочого простору pnpm:

Проєкт Зірки Дата міграції Коміт міграції
Next.js 2022-05-29 f7b81316aea4fc9962e5e54981a6d559004231aa
n8n 2022-11-09 736777385c54d5b20174c9c1fda38bb31fbf14b4
Angular 2025-07-31 82cc576e6ffb3884d1fcf872b7050612601e5b5c
Material UI 2024-01-03 a1263e3e5ef8d840252b4857f85b33caa99f471d
Vite 2021-09-26 3e1cce01d01493d33e50966d0d0fd39a86d229f9
Nuxt 2022-10-17 74a90c566c936164018c086030c7de65b26a5cb6
Vue 2021-10-09 61c5fbd3e35152f5f32e95bf04d3ee083414cecb
Astro 2022-03-08 240d88aefe66c7d73b9c713c5da42ae789c011ce
Prisma 2021-09-21 c4c83e788aa16d61bae7a6d00adc8a58b3789a06
Novu 2021-12-23 f2ea61f7d7ac7e12db4c9e70767082841ed98b2b
Slidev 2021-04-12 d6783323eb1ab1fc612577eb63579c8f7bc99c3a
Turborepo 2022-03-02 fd171519ec02a69c9afafc1bc5d9d1b481fba721
Quasar Framework 2024-03-13 7f8e550bb7b6ab639ce423d02008e7f5e61cbf55
Element Plus 2021-09-23 f9e192535ff74d1443f1d9e0c5394fad10428629
NextAuth.js 2022-05-03 4f29d39521451e859dbdb83179756b372e3dd7aa
Ember.js 2023-10-18 b6b05da662497183434136fb0148e1dec544db04
Qwik 2022-11-14 021b12f58cca657e0a008119bc711405513e1ee9
VueUse 2021-09-25 826351ba1d9c514e34426c85f3d69fb9875c7dd9
SvelteKit 2021-09-26 b164420ab26fa04fd0fbe0ac05431f36a89ef193
Verdaccio 2021-09-21 9dbf73e955fcb70b0a623c5ab89649b95146c744
Vercel 2023-01-12 9c768b98b71cfc72e8638bf5172be88c39e8fa69
Vitest 2021-12-13 d6ff0ccb819716713f5eab5c046861f4d8e4f988
Cycle.js 2021-09-21 f2187ab6688368edb904b649bd371a658f6a8637
Milkdown 2021-09-26 4b2e1dd6125bc2198fd1b851c4f00eda70e9b913
Nhost 2022-02-07 10a1799a1fef2f558f737de3bb6cadda2b50e58f
Logto 2021-07-29 0b002e07850c8e6d09b35d22fab56d3e99d77043
Втулки Rollup 2021-09-21 53fb18c0c2852598200c547a0b1d745d15b5b487
icestark 2021-12-16 4862326a8de53d02f617e7b1986774fd7540fccd
ByteMD 2021-02-18 36ef25f1ea1cd0b08752df5f8c832302017bb7fb
Компоненти Stimulus 2024-10-26 8e100d5b2c02ad5bf0b965822880a60f543f5ec3
Serenity/JS 2025-01-01 43dbe6f440d8dd81811da303e542381a17d06b4d
kysely 2025-07-29 5ac19105ddb17af310c67e004c11fa3345454b66
Mermaid 2022-09-22 db31f61368c2414f3bd5f5841bf217d75ba60a5e

Налаштування#

linkWorkspacePackages#

  • Стандартно: false
  • Тип: true, false, deep

Якщо цей параметр увімкнено, локально доступні пакунки буде повʼязано з node_modules замість того, щоб завантажувати їх з реєстру. Це дуже зручно в монорепо. Якщо вам потрібно, щоб локальні пакунки також були повʼязані з вкладеними залежностями, ви можете скористатися параметром deep.

В іншому випадку пакунки завантажуються і встановлюються з реєстру. Втім, пакунки робочих просторів все ще можна звʼязати за допомогою протоколу workspace:.

Пакунки звʼязуються, лише якщо їхні версії задовольняють діапазони залежностей.

injectWorkspacePackages#

  • Стандартно: false
  • Тип: Boolean

Вмикає жорстке звʼязування всіх локальних залежностей робочого простору замість їхнього звʼязування у вигляді символічних посилань. Крім того, цього можна досягти за допомогою dependenciesMeta[].injected, що дозволяє вибірково вмикати жорстке зв’язування для певних залежностей.

нотатка

Even if this setting is enabled, pnpm will prefer to deduplicate injected dependencies using symlinks, unless multiple dependency graphs are required due to mismatched peer dependencies. Ця поведінка контролюється параметром dedupeInjectedDeps.

dedupeInjectedDeps#

  • Стандартно: true
  • Тип: Boolean

Якщо цей параметр увімкнено, інʼєкції залежностей, буде звʼязано з робочим простором, коли це можливо. Якщо залежний проєкт та залежність-інʼєкція посилаються на ті самі однорангові залежності, то нема потреби фізично копіювати інжектовану залежність у node_modules залежного проєкту; достатньо символічного посилання.

syncInjectedDepsAfterScripts#

Додано у: v10.5.0

  • Стандартно: undefined
  • Тип: String[]

Інʼєкції залежності робочого простору — це колекції жорстких посилань, які не додають і не видаляють файли при зміні їхніх джерел. Це спричиняє проблеми у пакунках, які потрібно зібрати (наприклад, у проєктах на TypeScript).

Цей параметр являє собою список назв скриптів. Коли будь-який з цих скриптів виконується у пакунку робочої області, інʼєкції залежностей всередині node_modules також буде синхронізовано.

preferWorkspacePackages#

  • Стандартно: false
  • Тип: Boolean

Якщо цей параметр увімкнено, локальним пакункам з робочого простору надається перевага перед пакунками з реєстру, навіть якщо у реєстрі є новіша версія пакунка.

Цей параметр корисний лише у тому випадку, якщо у робочому просторі не використовується saveWorkspaceProtocol .

sharedWorkspaceLockfile#

  • Стандартно: true
  • Тип: Boolean

Якщо цей параметр увімкнено, pnpm створить єдиний файл pnpm-lock.yaml у корені робочого простору. Це також означає, що всі залежності пакунків робочої області будуть знаходитися у єдиній теці node_modules (і будуть привʼязані до теки їх пакунків node_modules для розпізнавання модулів Node).

Переваги цього параметра:

  • кожна залежність є одиночною
  • швидші установки в монорепо
  • менше змін у перевірках коду, оскільки всі вони містяться в одному файлі

нотатка

Попри те, що всі залежності будуть жорстко повʼязані з кореневим node_modules, пакунки матимуть доступ лише до тих залежностей, які оголошено у їхньому package.json, таким чином строгість pnpm зберігається. Це результат вищезгаданого символічного звʼязування.

saveWorkspaceProtocol#

  • Стандартно: rolling
  • Тип: true, false, rolling

Цей параметр керує тим, як залежності, приєднані з робочої області, додаються до package.json.

Якщо foo@1.0.0 знаходиться у робочому просторі і ви виконуєте pnpm add foo в іншому проєкті робочого простору, нижче показано, як foo буде додано до поля залежностей. Параметр savePrefix також впливає на те, як створюється специфікація.

saveWorkspaceProtocol savePrefix spec
false '' 1.0.0
false '~' ~1.0.0
false '^' ^1.0.0
true '' workspace:1.0.0
true '~' workspace:~1.0.0
true '^' workspace:^1.0.0
rolling '' workspace:*
rolling '~' workspace:~
rolling '^' workspace:^

includeWorkspaceRoot#

  • Стандартно: false
  • Тип: Boolean

При рекурсивному виконанні команд у робочій області, виконуйте їх також у кореневому проєкті робочої області.

ignoreWorkspaceCycles#

  • Стандартно: false
  • Тип: Boolean

When set to true, no workspace dependency cycle warnings will be printed. It also downgrades an ERR_PNPM_TASK_CYCLE from a recursive run to a warning. The tasks in that cycle then have no guaranteed order relative to each other. See Workspace task orchestration.

disallowWorkspaceCycles#

  • Стандартно: false
  • Тип: Boolean

Якщо встановлено значення true, встановлення не вдасться, якщо у робочій області є цикли.

workspaceConcurrency#

  • Default: the smaller of 4 and the number of available CPU cores
  • Тип: Number

Controls how many workspace tasks run at once. See --workspace-concurrency for details.

ignoreWorkspaceRootCheck#

  • Стандартно: false
  • Тип: Boolean

Allow adding dependencies to the workspace root without passing --ignore-workspace-root-check or -w.

pnpm-workspace.yaml
ignoreWorkspaceRootCheck: true

failIfNoMatch#

  • Стандартно: false
  • Тип: Boolean

Якщо встановлено значення true, CLI завершить роботу з ненульовим кодом, якщо жоден пакунок не відповідає наданим фільтрам.

Наприклад, наступна команда завершиться з ненульовим кодом, оскільки bad-pkg-name відсутній у робочій області:

pnpm --filter=bad-pkg-name test