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.
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:~
oworkspace:^
) - L'intervallo semver associato (per qualsiasi altro tipo di intervallo)
Quindi, ad esempio, se abbiamo foo
, bar
, qar
, zoo
nello 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:
Progetto | Stelle | Data di migrazione | Commit di migrazione |
---|---|---|---|
Next.js | 2022-05-29 | f7b81316aea4fc9962e5e54981a6d559004231aa | |
Material UI | 2024-01-03 | a1263e3e5ef8d840252b4857f85b33caa99f471d | |
Vite | 2021-09-26 | 3e1cce01d01493d33e50966d0d0fd39a86d229f9 | |
Nuxt | 2022-10-17 | 74a90c566c936164018c086030c7de65b26a5cb6 | |
Vue 3.0 | 2021-10-09 | 61c5fbd3e35152f5f32e95bf04d3ee083414cecb | |
Astro | 2022-03-08 | 240d88aefe66c7d73b9c713c5da42ae789c011ce | |
n8n | 2022-11-09 | 736777385c54d5b20174c9c1fda38bb31fbf14b4 | |
Prisma | 2021-09-21 | c4c83e788aa16d61bae7a6d00adc8a58b3789a06 | |
Novu | 2021-12-23 | f2ea61f7d7ac7e12db4c9e70767082841ed98b2b | |
Slidev | 2021-04-12 | d6783323eb1ab1fc612577eb63579c8f7bc99c3a | |
Turborepo | 2022-03-02 | fd171519ec02a69c9afafc1bc5d9d1b481fba721 | |
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 plugins | 2021-09-21 | 53fb18c0c2852598200c547a0b1d745d15b5b487 | |
icestark | 2021-12-16 | 4862326a8de53d02f617e7b1986774fd7540fccd | |
ByteMD | 2021-02-18 | 36ef25f1ea1cd0b08752df5f8c832302017bb7fb |