Passa al contenuto principale
Version: 6.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.

Protocollo dello spazio di lavoro (workspace:)

Aggiunto nella versione: v3.7.0.

Per impostazione predefinita, pnpm collegherà i pacchetti dallo spazio di lavoro se i pacchetti disponibili corrispondono agli intervalli dichiarati. Ad esempio, [email protected] è collegato a bar se bar ha "foo": "^1.0.0" nelle sue dipendenze. Tuttavia, se bar ha "foo": "2.0.0" nelle dipendenze e [email protected] non è nello spazio di lavoro, [email protected] 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é "[email protected]" 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

Aggiunto nella versione: v5.12.0

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:[email protected]*".

Prima della pubblicazione, gli alias vengono convertiti in normali dipendenze con alias. L'esempio sopra diventerà "bar": "npm:[email protected]".

Riferimenti ai pacchetti dello spazio di lavoro attraverso il percorso relativo

Aggiunto nella versione: v5.12.0

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.

Opzioni

Aggiunto nella versione: v2.14.0

  • Predefinito: true
  • Tipo: true, false, deep

Se è abilitato, i pacchetti disponibili localmente sono collegati a node_modules invece di essere scaricati dal registro. Questo è molto conveniente in un monorepo. Se hai bisogno che i pacchetti locali siano collegati anche alle dipendenze secondarie, puoi usare l'impostazione deep (dalla v5).

Altrimenti, i pacchetti vengono scaricati e installati dal registro. Tuttavia, i pacchetti dello spazio di lavoro possono ancora essere collegati utilizzando il protocollo di intervallo workspace:.

prefer-workspace-packages

Aggiunto nella versione: v5.13.0

  • Predefinito: false
  • Tipo: Booleano

Se questa opzione è abilitata, i pacchetti locali dello spazio di lavoro sono preferiti rispetto ai pacchetti del registro, anche se è presente una versione più recente del pacchetto nel registro.

Questa impostazione è utile solo se l'area di lavoro non utilizza save-workspace-protocol.

shared-workspace-lockfile

Aggiunto in: v2.17.0 come shared-workspace-shrinkwrap

  • Predefinito: true
  • Tipo: Booleano

Se questa opzione è abilitata, pnpm crea un unico file pnpm-lock.yaml nella radice dello spazio di lavoro. Ciò significa anche che tutte le dipendenze dei pacchetti dello spazio di lavoro saranno in una singola cartella node_modules (e saranno collegate simbolicamente alla loro node_modules per la risoluzione del modulo di Node).

Vantaggi di questa opzione:

  • ogni dipendenza è un elemento singolo
  • installazioni più veloci in un monorepo
  • meno modifiche nelle revisioni del codice poiché sono tutte in un unico file
note

Anche se tutte le dipendenze saranno collegate fisicamente nella radice di node_modules, i pacchetti avranno accesso solo a quelle dipendenze che sono dichiarate nel loro package.json, quindi la rigidità di pnpm è preservata. Questo è il risultato del suddetto collegamento simbolico.

save-workspace-protocol

  • Predefinito: true
  • Tipo: Booleano

Se questo è abilitato, verranno aggiunte nuove dipendenze con il protocollo dello spazio di lavoro SE (e solo se) sono presenti nello spazio di lavoro.

Potresti voler modificare questa impostazione su false se gli strumenti nel tuo repository non comprendono il protocollo dello spazio di lavoro (e idealmente invia un PR ai tuoi strumenti per ottenerlo aggiunto in futuro).

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 progetti open source che utilizzano la funzione dello spazio di lavoro di pnpm:

  • Versione 3.0 (dal 9/10/2021, commit 61c5fbd3e35152f5f32e95bf04d3ee083414cecb)
  • Vite (dal 26/09/2021, commit 3e1cce01d01493d33e50966d0d0fd39a86d229f9)
  • Cycle.js (dal 21/09/2021, commit f2187ab6688368edb904b649bd371a658f6a8637)
  • Prisma (dal 21/09/2021, commit c4c83e788aa16d61bae7a6d00adc8a58b3789a06)
  • Verdaccio (dal 21/09/2021, commit 9dbf73e955fcb70b0a623c5ab89649b95146c744)
  • Plugin di Rollup (dal 21/09/2021, commit 53fb18c0c2852598200c547a0b1d745d15b5b487)
  • Milkdown (dal 26/09/2021, commit 4b2e1dd6125bc2198fd1b851c4f00eda70e9b913)
  • ByteMD (dal 18/02/2021, commit 36ef25f1ea1cd0b08752df5f8c832302017bb7fb)
  • VueUse (dal 25/09/2021, commit 826351ba1d9c514e34426c85f3d69fb9875c7dd9)
  • Slidev (dal 4/12/2021, commit d6783323eb1ab1fc612577eb63579c8f7bc99c3a)
  • SvelteKit (dal 26/09/2021, commit b164420ab26fa04fd0fbe0ac05431f36a89ef193)
  • Telecraft (dal 26/09/2021, commit 73a9c48c9d4f160d758b8881f404cc52c20a7454)
  • GiraphQL (a partire dal 4/8/2021, commit 3dd3ff148da382d6f406f20626a9a5c25707c0c8)