Pular para o conteúdo principal
Versão: Next

Como os pares são resolvidos

Um dos melhores recursos do pnpm é que em um projeto, uma versão específica de um pacote sempre terá um conjunto de dependências. There is one exception from this rule, though - packages with peer dependencies.

As dependências de peer são resolvidas a partir de dependências instaladas mais acima no gráfico de dependência, pois compartilham a mesma versão que seu pai. Isso significa que, se [email protected] tiver dois pares (bar@^1 e baz@^1), ele poderá ter vários conjuntos diferentes de dependências no mesmo projeto.

No exemplo acima, [email protected] está instalado para foo-parent-1 e foo-parent-2. Both packages have bar and baz as well, but they depend on different versions of baz. Como resultado, [email protected] tem dois conjuntos diferentes de dependências: um com [email protected] e outro com [email protected]. Para dar suporte a esses casos de uso, o pnpm precisa vincular [email protected] tantas vezes quanto existem diferentes conjuntos de dependências.

Normalmente, se um pacote não possui dependências de pares, ele é vinculado a uma pasta node_modules próxima aos links simbólicos de suas dependências, assim:

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

No entanto, se foo tiver dependências de pares, pode haver vários conjuntos de dependências para ele, então criamos conjuntos diferentes para diferentes resoluções de dependência de pares:

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]

Criamos links simbólicos para o foo que está dentro [email protected][email protected][email protected] ou para aquele em [email protected][email protected][email protected]. Como consequência, o resolvedor do módulo Node.js encontrará os pares corretos.

Se um pacote não tem dependências de pares, mas tem dependências com pares que são resolvidos mais acima no gráfico, então esse pacote transitivo pode aparecer no projeto com diferentes conjuntos de dependências. Por exemplo, há o pacote [email protected] com uma única dependência [email protected]. [email protected] tem uma dependência de pares c@^1. [email protected] nunca resolverá os peers de [email protected], então torna-se dependente dos peers de [email protected] também.

Veja como essa estrutura ficará em node_modules. Neste exemplo, [email protected] precisarão aparecer duas vezes nos node_modules do projeto uma vez com [email protected] e novamente com [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]
OSZAR »