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.
A workspace must have a pnpm-workspace.yaml
file in its
root. A workspace also may have an .npmrc
in its root.
If you are looking into monorepo management, you might also want to look into 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. There's an article about bit install
that talks about it: Painless Monorepo Dependency Management with Bit.
Protocollo dello spazio di lavoro (workspace:)
If link-workspace-packages is set to true
, pnpm will link packages from the workspace if the available packages
match the declared ranges. 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. However, if bar
has
"foo": "2.0.0"
in dependencies and foo@2.0.0
is not in the workspace,
foo@2.0.0
will be installed from the registry. Questo comportamento introduce qualche
incertezza.
Luckily, pnpm supports the workspace:
protocol. Quando
viene utilizzato questo protocollo, pnpm si rifiuterà di risolvere qualsiasi altra cosa che non sia un
pacchetto locale dello spazio di lavoro. So, if you set "foo": "workspace:2.0.0"
, this time
installation will fail because "foo@2.0.0"
isn't present in the workspace.
This protocol is especially useful when the link-workspace-packages option is
set to false
. In that case, pnpm will only link packages from the workspace if
the workspace:
protocol is used.
Riferimenti ai pacchetti dello spazio di lavoro tramite alias
Let's say you have a package in the workspace named foo
. Usually, you would
reference it as "foo": "workspace:*"
.
If you want to use a different alias, the following syntax will work too:
"bar": "workspace:foo@*"
.
Prima della pubblicazione, gli alias vengono convertiti in normali dipendenze con alias. The above
example will become: "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
may have foo
in its dependencies declared as
"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
When a workspace package is packed into an archive (whether it's through
pnpm pack
or one of the publish commands like pnpm publish
), we dynamically
replace any workspace:
dependency by:
- The corresponding version in the target workspace (if you use
workspace:*
,workspace:~
, orworkspace:^
) - L'intervallo semver associato (per qualsiasi altro tipo di intervallo)
So for example, if we have foo
, bar
, qar
, zoo
in the workspace and they all are at version 1.5.0
, the following:
{
"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:
For how to set up a repository using Rush, read this page.
For using Changesets with pnpm, read this guide.
Troubleshooting
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.
If you see the message There are cyclic workspace dependencies
, please inspect workspace dependencies declared in dependencies
, optionalDependencies
and devDependencies
.
Esempi di utilizzo
Ecco alcuni dei progetti open source più famosi che utilizzano la funzione dello spazio di lavoro di pnpm: