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

Supportato dalla v3.7.0.

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. 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: (lo stesso di Yarn v2). 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

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: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

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 usa *)
  • L'intervallo semver associato (per qualsiasi altro tipo di intervallo)

Quindi, ad esempio, se abbiamo tre pacchetti 1.5.0, la seguente:

{
"dependencies": {
"foo": "workspace:*",
"bar": "workspace:^1.2.3"
}
}

Verrà trasformato in:

{
"dependencies": {
"foo": "1.5.0",
"bar": "^1.2.3"
}
}

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).