Passa al contenuto principale
Version: Prossimo

Come vengono risolti i peer

Una delle migliori caratteristiche di pnpm è che in un progetto, una versione specifica di un pacchetto avrà sempre un set di dipendenze. C'è un'eccezione da questa regola, però: pacchetti con dipendenze peer.

Le dipendenze peer vengono risolte dalle dipendenze installate più in alto nel grafico delle dipendenze, poiché condividono la stessa versione del genitore. Ciò significa che se [email protected] ha due peer ([email protected]^1 e [email protected]^1) allora potrebbe avere diversi insiemi di dipendenze nello stesso progetto.

Nell'esempio sopra, [email protected] è installato per foo-parent-1 e foo-parent-2. Entrambi i pacchetti hanno anche bar e baz, ma dipendono da diverse versioni di baz. Di conseguenza, [email protected] ha due diversi insiemi di dipendenze: uno con [email protected] e l'altro con [email protected]. Per supportare questi casi di utilizzo, pnpm deve collegare fisicamente [email protected] tante volte quanti diversi set di dipendenze sono presenti.

Normalmente, se un pacchetto non ha dipendenze peer, è difficilmente collegato a una node_modules accanto ai collegamenti simbolici delle sue dipendenze, in questo modo:

node_modules
└── .pnpm
├── [email protected]
│ └── node_modules
│ ├── foo
│ ├── qux -> ../../[email protected]/node_modules/qux
│ └── plugh -> ../../[email protected]/node_modules/plugh
├── [email protected]
├── [email protected]

Tuttavia, se pippo ha dipendenze peer, potrebbero esserci più gruppi di dipendenze, quindi creiamo gruppi diversi per diverse risoluzioni di dipendenze peer:

node_modules
└── .pnpm
├── [email protected][email protected][email protected]
│ └── node_modules
│ ├── foo
│ ├── bar -> ../../[email protected]/node_modules/bar
│ ├── baz -> ../../[email protected]/node_modules/baz
│ ├── qux -> ../../[email protected]/node_modules/qux
│ └── plugh -> ../../[email protected]/node_modules/plugh
├── [email protected][email protected][email protected]
│ └── node_modules
│ ├── foo
│ ├── bar -> ../../[email protected]/node_modules/bar
│ ├── baz -> ../../[email protected]/node_modules/baz
│ ├── qux -> ../../[email protected]/node_modules/qux
│ └── plugh -> ../../[email protected]/node_modules/plugh
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]

Creiamo collegamenti simbolici a foo che si trova all'interno di [email protected][email protected][email protected] o a quello in [email protected][email protected][email protected]. Di conseguenza, il risolutore del modulo Node.js troverà i peer corretti.

Se un pacchetto non ha dipendenze peer ma ha dipendenze con peer risolti più in alto nel grafico, allora quel pacchetto transitivo può apparire nel con diversi gruppi di dipendenze. Ad esempio, c'è il pacchetto [email protected] con una singola dipendenza [email protected]. [email protected] ha una dipendenza peer [email protected]^1. [email protected] non risolverà mai i peer di [email protected], quindi diventa dipendente anche dai peer di [email protected].

Ecco come apparirà quella struttura in node_modules. In questo esempio, [email protected] dovrà apparire due volte nei node_modules - risolto una volta con [email protected] e di nuovo con [email protected].

node_modules
└── .pnpm
├── [email protected][email protected]
│ └── node_modules
│ ├── a
│ └── b -> ../../[email protected][email protected]/node_modules/b
├── [email protected][email protected]
│ └── node_modules
│ ├── a
│ └── b -> ../../[email protected][email protected]/node_modules/b
├── [email protected][email protected]
│ └── node_modules
│ ├── b
│ └── c -> ../../[email protected]/node_modules/c
├── [email protected][email protected]
│ └── node_modules
│ ├── b
│ └── c -> ../../[email protected]/node_modules/c
├── [email protected]
├── [email protected]