Passa al contenuto principale
Versione: 7.x

Spazio di lavoro

pnpm ha il supporto integrato per i monorepository (alias repository multi-pacchetto, repository multi-progetto o repository monolitici). Puoi creare uno spazio di lavoro per unire più progetti all'interno di un unico repository.

Uno spazio di lavoro deve avere un file pnpm-workspace.yaml nella sua radice. Uno spazio di lavoro può anche avere un .npmrc nella sua radice.

tip

Se stai esaminando la gestione del monorepo, potresti anche voler esaminare Bit. Bit utilizza pnpm sotto il cofano ma automatizza molte delle cose che attualmente vengono eseguite manualmente in un'area di lavoro tradizionale gestita da pnpm/npm/Yarn. C'è un articolo riguardo a bit install che ne parla: Gestione indolore delle dipendenze in un monorepo con Nit.

Protocollo dello spazio di lavoro (workspace:)

Per impostazione predefinita, pnpm collegherà i pacchetti dallo spazio di lavoro se i pacchetti disponibili corrispondono agli intervalli dichiarati. 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. Tuttavia, se bar ha "foo": "2.0.0" nelle dipendenze e foo@2.0.0 non è nello spazio di lavoro, foo@2.0.0 verrà installato dal registro. Questo comportamento introduce qualche incertezza.

Fortunatamente, pnpm supporta il protocollo workspace:. Quando viene utilizzato questo protocollo, pnpm si rifiuterà di risolvere qualsiasi altra cosa che non sia un pacchetto locale dello spazio di lavoro. Quindi, se imposti "foo": "workspace:2.0.0", questa volta l'installazione avrà esito negativo perché "foo@2.0.0" non è presente nello spazio di lavoro.

Questo protocollo è particolarmente utile quando l'opzione link-workspace-packages è impostata su false. In tal caso, pnpm collegherà i pacchetti dallo spazio di lavoro solo se viene utilizzato il protocollo workspace:.

Riferimenti ai pacchetti dello spazio di lavoro tramite alias

Diciamo che hai un pacchetto nello spazio di lavoro chiamato foo. Di solito, faresti riferimento ad esso tramite "foo": "workspace:*".

Se vuoi usare un alias diverso, funzionerà anche la seguente sintassi: "bar": "workspace:foo@*".

Prima della pubblicazione, gli alias vengono convertiti in normali dipendenze con alias. L'esempio sopra diventerà "bar": "npm:foo@1.0.0".

Riferimenti ai pacchetti dello spazio di lavoro attraverso il percorso relativo

In uno spazio di lavoro con 2 pacchetti:

+ packages
+ foo
+ bar

bar può avere foo nelle sue dipendenze dichiarate come "foo": "workspace:../foo". Prima della pubblicazione, queste specifiche vengono convertite in specifiche della versione normale supportate da tutti i gestori di pacchetti.

Pubblicazione di pacchetti dello spazio di lavoro

Quando un pacchetto dello spazio di lavoro viene compresso in un archivio (che sia tramite pnpm pack o uno dei comandi di pubblicazione come pnpm publish), sostituiamo dinamicamente qualsiasi dipendenza workspace: con:

  • La versione corrispondente nello spazio di lavoro di destinazione (se si utilizza workspace:*, workspace:~o workspace:^)
  • L'intervallo semver associato (per qualsiasi altro tipo di intervallo)

Quindi, ad esempio, se abbiamo foo, bar, qar, zoonello spazio di lavoro e sono tutti alla versione 1.5.0, quanto segue:

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

Verrà trasformato in:

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

Questa funzione ti consente di dipendere dai tuoi pacchetti dello spazio di lavoro locale pur essendo ancora in grado di pubblicare i pacchetti risultanti nel registro remoto senza che necessiti di passaggi di pubblicazione intermedi: i tuoi consumatori saranno in grado di utilizzare i tuoi spazi di lavoro pubblicati come qualsiasi altro pacchetto, ancora beneficiando dalle garanzie semver offerte.

Flusso di lavoro del rilascio

Il controllo delle versioni dei pacchetti all'interno di uno spazio di lavoro è un'attività complessa e attualmente pnpm non fornisce una soluzione integrata per esso. Tuttavia, ci sono 2 strumenti ben testati che gestiscono il controllo delle versioni e supportano pnpm:

Per informazioni su come configurare un repository utilizzando Rush, leggi questa pagina.

Per utilizzare i Changeset con pnpm, leggi questa guida.

Risoluzione dei problemi

pnpm non può garantire che gli script verranno eseguiti in ordine topologico se sono presenti cicli tra le dipendenze dello spazio di lavoro. Se pnpm rileva dipendenze cicliche durante l'installazione, genererà un avviso. Se pnpm è in grado di scoprire quali dipendenze stanno causando i cicli, verrano mostrati anche loro.

Se viene visualizzato il messaggio Sono presenti dipendenze cicliche, ispezionare le dipendenze dello spazio di lavoro dichiarate in dependencies, optionalDependencies e devDependencies.

Esempi di utilizzo

Ecco alcuni dei progetti open source più famosi che utilizzano la funzione dello spazio di lavoro di pnpm:

ProgettoStelleData di migrazioneCommit di migrazione
Next.js2022-05-29f7b81316aea4fc9962e5e54981a6d559004231aa
Vite2021-09-263e1cce01d01493d33e50966d0d0fd39a86d229f9
Vue 3.02021-10-0961c5fbd3e35152f5f32e95bf04d3ee083414cecb
Prisma2021-09-21c4c83e788aa16d61bae7a6d00adc8a58b3789a06
Slidev2021-04-12d6783323eb1ab1fc612577eb63579c8f7bc99c3a
Element Plus2021-09-23f9e192535ff74d1443f1d9e0c5394fad10428629
Verdaccio2021-09-219dbf73e955fcb70b0a623c5ab89649b95146c744
Astro2022-03-08240d88aefe66c7d73b9c713c5da42ae789c011ce
Cycle.js2021-09-21f2187ab6688368edb904b649bd371a658f6a8637
VueUse2021-09-25826351ba1d9c514e34426c85f3d69fb9875c7dd9
NextAuth.js2022-05-034f29d39521451e859dbdb83179756b372e3dd7aa
SvelteKit2021-09-26b164420ab26fa04fd0fbe0ac05431f36a89ef193
Milkdown2021-09-264b2e1dd6125bc2198fd1b851c4f00eda70e9b913
Vitest2021-12-13d6ff0ccb819716713f5eab5c046861f4d8e4f988
Logto2021-07-290b002e07850c8e6d09b35d22fab56d3e99d77043
Nhost2022-02-0710a1799a1fef2f558f737de3bb6cadda2b50e58f
Rollup plugins2021-09-2153fb18c0c2852598200c547a0b1d745d15b5b487
ByteMD2021-02-1836ef25f1ea1cd0b08752df5f8c832302017bb7fb
icestark2021-12-164862326a8de53d02f617e7b1986774fd7540fccd
VuePress 2.02022-04-23b85b1c3b39e80a8de92a7469381061f75ef33623
Turborepo2022-03-02fd171519ec02a69c9afafc1bc5d9d1b481fba721