Skip to content
On this page

peerDependencies Resolution

패키지가 peerDependencies를 가지는 경우, .pnpm의 구성은 어떻게 달라질까?

peerDependencies는 해당 패키지를 사용하는 부모 패키지에 의해서 구체화되는 성질을 가지는데, 동일한 패키지를 사용하는 2개 이상의 부모 패키지에서 실제로 사용하는 peerDependency 패키지의 버전이 다른 경우가 생길 수 있습니다.

예를 들어, 패키지 foo의 peerDependencies가 아래와 같다면…

text
peerDependencies
├- bar@^1
├- baz@^1

foo를 사용하는 두 부모 패키지들(foo-parent-1, foo-parent-2)에서 foo가 사용할 baz의 버전이 다를 수 있다는 겁니다.

text
node_modules
├- foo-parent-1
|  ├- bar@1.0.0
|  ├- baz@1.0.0
|  ├- foo@1.0.0
|
├- foo-parent-2
   ├- bar@1.0.0
   ├- baz@1.1.0
   ├- foo@1.0.0

위와 같은 경우, baz 버전별로 foo의 virtual store를 분리하면 됩니다.

text
node_modules
└── .pnpm
    ├── foo@1.0.0_bar@1.0.0+baz@1.0.0
    │   └── node_modules
    │       ├── foo
    │       ├── bar   -> ../../bar@1.0.0/node_modules/bar
    │       ├── baz   -> ../../baz@1.0.0/node_modules/baz

    ├── foo@1.0.0_bar@1.0.0+baz@1.1.0
    │   └── node_modules
    │       ├── foo
    │       ├── bar   -> ../../bar@1.0.0/node_modules/bar
    │       ├── baz   -> ../../baz@1.1.0/node_modules/baz

    ├── bar@1.0.0
    ├── baz@1.0.0
    ├── baz@1.1.0
    ├── qux@1.0.0
    ├── plugh@1.0.0

현재 패키지는 peerDependencies는 없지만 특정 dependency에는 peerDependencies를 가지는 경우도 비슷하게(?) 처리하면 됩니다.

예를 들어, 패키지 a는 peerDependencies는 없는데 dependency인 패키지 b에 peerDependenciesc@^1(c@1.0.0, c@1.1.0)이 있는 상태라면, .pnpm은 다음과 같이 구성됩니다.

text
node_modules
└── .pnpm
    ├── a@1.0.0_c@1.0.0
    │   └── node_modules
    │       ├── a
    │       └── b -> ../../b@1.0.0_c@1.0.0/node_modules/b
    ├── a@1.0.0_c@1.1.0
    │   └── node_modules
    │       ├── a
    │       └── b -> ../../b@1.0.0_c@1.1.0/node_modules/b
    ├── b@1.0.0_c@1.0.0
    │   └── node_modules
    │       ├── b
    │       └── c -> ../../c@1.0.0/node_modules/c
    ├── b@1.0.0_c@1.1.0
    │   └── node_modules
    │       ├── b
    │       └── c -> ../../c@1.1.0/node_modules/c
    ├── c@1.0.0
    ├── c@1.1.0