Passa al contenuto principale
Versione: Prossimo

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. Ad esempio, foo@1.0.0 è collegato a bar se bar ha "foo": "^1.0.0" nelle sue dipendenze e foo@1.0.0 è nell'area di lavoro. 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
Material UI2024-01-03a1263e3e5ef8d840252b4857f85b33caa99f471d
Vite2021-09-263e1cce01d01493d33e50966d0d0fd39a86d229f9
Nuxt2022-10-1774a90c566c936164018c086030c7de65b26a5cb6
Vue 3.02021-10-0961c5fbd3e35152f5f32e95bf04d3ee083414cecb
Astro2022-03-08240d88aefe66c7d73b9c713c5da42ae789c011ce
n8n2022-11-09736777385c54d5b20174c9c1fda38bb31fbf14b4
Prisma2021-09-21c4c83e788aa16d61bae7a6d00adc8a58b3789a06
Novu2021-12-23f2ea61f7d7ac7e12db4c9e70767082841ed98b2b
Slidev2021-04-12d6783323eb1ab1fc612577eb63579c8f7bc99c3a
Turborepo2022-03-02fd171519ec02a69c9afafc1bc5d9d1b481fba721
Element Plus2021-09-23f9e192535ff74d1443f1d9e0c5394fad10428629
NextAuth.js2022-05-034f29d39521451e859dbdb83179756b372e3dd7aa
Ember.js2023-10-18b6b05da662497183434136fb0148e1dec544db04
Qwik2022-11-14021b12f58cca657e0a008119bc711405513e1ee9
VueUse2021-09-25826351ba1d9c514e34426c85f3d69fb9875c7dd9
SvelteKit2021-09-26b164420ab26fa04fd0fbe0ac05431f36a89ef193
Verdaccio2021-09-219dbf73e955fcb70b0a623c5ab89649b95146c744
Vercel2023-01-129c768b98b71cfc72e8638bf5172be88c39e8fa69
Vitest2021-12-13d6ff0ccb819716713f5eab5c046861f4d8e4f988
Cycle.js2021-09-21f2187ab6688368edb904b649bd371a658f6a8637
Milkdown2021-09-264b2e1dd6125bc2198fd1b851c4f00eda70e9b913
Nhost2022-02-0710a1799a1fef2f558f737de3bb6cadda2b50e58f
Logto2021-07-290b002e07850c8e6d09b35d22fab56d3e99d77043
Rollup plugins2021-09-2153fb18c0c2852598200c547a0b1d745d15b5b487
icestark2021-12-164862326a8de53d02f617e7b1986774fd7540fccd
ByteMD2021-02-1836ef25f1ea1cd0b08752df5f8c832302017bb7fb