피어 종속성 설정
autoInstallPeers#
- 기본값: true
- 타입: Boolean
true이면 누락된 선택적이지 않은 피어 종속성이 모두 자동으로 설치됩니다.
피어 범위를 충족하는 가장 높은 버전이 선택됩니다. 자동으로 설치된 피어는 프로젝트가 선언한 종속성이 아니므로, resolutionMode는 이를 직접 종속성이 아닌 하위 종속성으로 취급하며, 따라서 lowest-direct가 이 버전을 낮추지 않습니다.
버전 충돌#
서로 다른 패키지에서 피어 종속성에 대해 충돌하는 버전 요구 사항이 있는 경우, pnpm은 충돌하는 피어 종속성의 어떤 버전도 자동으로 설치하지 않습니다. 대신 경고가 출력됩니다. 예를 들어, 한 종속성은 react@^16.0.0을 요구하고 다른 종속성은 react@^17.0.0을 요구하면 이 요구 사항들은 충돌하므로 자동 설치가 이루어지지 않습니다.
충돌 해결#
버전 충돌이 발생한 경우, 설치할 피어 종속성의 버전을 직접 판단하거나, 종속성을 업데이트하여 피어 종속성 요구 사항을 맞춰야 합니다.
dedupePeerDependents#
- 기본값: true
- 타입: Boolean
이 설정이 true로 설정되면, 피어 해석 후 피어 종속성이 있는 패키지의 중복이 제거됩니다.
예를 들어, 두 개의 프로젝트가 있는 워크스페이스가 있고 두 프로젝트 모두 종속성에 webpack이 있다고 가정해 보겠습니다. webpack은 선택적 피어 종속성에 esbuild가 있으며, 프로젝트 중 하나는 종속성에 esbuild가 있습니다. 이 경우 pnpm은 webpack의 인스턴스 두 개를 node_modules/.pnpm 디렉터리에 링크합니다: 하나는 esbuild가 있는 것이고 다른 하나는 없는 것입니다:
node_modules
.pnpm
webpack@1.0.0_esbuild@1.0.0
webpack@1.0.0
project1
node_modules
webpack -> ../../node_modules/.pnpm/webpack@1.0.0/node_modules/webpack
project2
node_modules
webpack -> ../../node_modules/.pnpm/webpack@1.0.0_esbuild@1.0.0/node_modules/webpack
esbuild
이는 타당한데, webpack이 두 프로젝트에서 사용되고 그중 한 프로젝트에는 esbuild가 없으므로 두 프로젝트가 동일한 webpack 인스턴스를 공유할 수 없기 때문입니다. 그러나 이는 대부분의 개발자가 기대하는 바가 아닌데, 특히 호이스팅된 node_modules에서는 webpack 인스턴스가 하나만 존재하기 때문입니다. 따라서 이제 dedupePeerDependents 설정을 사용하여 충돌하는 피어 종속성이 없을 때 webpack의 중복을 제거할 수 있습니다(설명은 마지막에 있음). 이 경우 dedupePeerDependents를 true로 설정하면, 두 프로젝트 모두 동일한 webpack 인스턴스를 사용하며, 이는 esbuild가 해석된 인스턴스입니다:
node_modules
.pnpm
webpack@1.0.0_esbuild@1.0.0
project1
node_modules
webpack -> ../../node_modules/.pnpm/webpack@1.0.0_esbuild@1.0.0/node_modules/webpack
project2
node_modules
webpack -> ../../node_modules/.pnpm/webpack@1.0.0_esbuild@1.0.0/node_modules/webpack
esbuild
충돌하는 피어 종속성이란 무엇인가요? 충돌하는 피어 종속성이란 다음과 같은 시나리오를 의미합니다:
node_modules
.pnpm
webpack@1.0.0_react@16.0.0_esbuild@1.0.0
webpack@1.0.0_react@17.0.0
project1
node_modules
webpack -> ../../node_modules/.pnpm/webpack@1.0.0_react@17.0.0/node_modules/webpack
react (v17)
project2
node_modules
webpack -> ../../node_modules/.pnpm/webpack@1.0.0_react@16.0.0_esbuild@1.0.0/node_modules/webpack
esbuild
react (v16)
이 경우 webpack의 중복을 제거할 수 없는데, webpack은 피어 종속성에 react가 있고 react는 두 프로젝트의 컨텍스트에서 서로 다른 두 버전으로 해석되기 때문입니다.
dedupePeers#
버전 10.33.0에서 추가됨
- 기본값: false
- 타입: Boolean
활성화하면 피어 종속성 접미사에 전체 종속성 경로 대신 버전만 있는 식별자(name@version)를 사용하여, (foo@1.0.0(bar@2.0.0)) 같은 중첩 접미사를 제거합니다. 이를 통해 재귀적인 피어 종속성이 많은 프로젝트에서 패키지 인스턴스 수가 크게 줄어듭니다.
이는 서로 다른 워크스페이스 프로젝트 간에 동일한 피어 종속성을 가진 패키지의 중복을 제거하는 dedupePeerDependents와는 다릅니다. dedupePeers는 피어 종속성 접미사 형식 자체를 단순화합니다.
strictPeerDependencies#
- 기본값: false
- 타입: Boolean
이 옵션이 활성화되어 있으면, 트리에 누락되었거나 유효하지 않은 피어 종속성이 있을 때 명령이 실패합니다.
resolvePeersFromWorkspaceRoot#
- 기본값: true
- 타입: Boolean
활성화하면 루트 워크스페이스 프로젝트의 종속성이 워크스페이스 내 모든 프로젝트의 피어 종속성을 해석하는 데 사용됩니다. 피어 종속성을 워크스페이스 루트에만 설치할 수 있고, 워크스페이스의 모든 프로젝트가 동일한 버전의 피어 종속성을 사용한다고 확신할 수 있으므로 유용한 기능입니다.
peerDependencyRules#
peerDependencyRules.ignoreMissing#
pnpm은 이 목록에 있는 피어 종속성이 누락된 경우 경고를 출력하지 않습니다.
예를 들어, 다음 구성을 사용하면 종속성에 react가 필요하지만 react가 설치되어 있지 않은 경우 pnpm이 경고를 출력하지 않습니다:
peerDependencyRules:
ignoreMissing:
- react
패키지 이름 패턴도 사용할 수 있습니다:
peerDependencyRules:
ignoreMissing:
- "@babel/*"
- "@eslint/*"
peerDependencyRules.allowedVersions#
지정된 범위의 피어 종속성에 대해서는 충족되지 않은 피어 종속성 경고가 출력되지 않습니다.
예를 들어, react@16이 필요한 종속성이 있지만 react@17에서도 잘 동작한다는 것을 알고 있다면, 다음 구성을 사용할 수 있습니다:
peerDependencyRules:
allowedVersions:
react: "17"
이렇게 하면 피어 종속성에 react가 있는 모든 종속성이 react v17 설치를 허용해야 한다고 pnpm에 알려줍니다.
특정 패키지의 피어 종속성에 대해서만 경고를 표시하지 않도록 할 수도 있습니다. 예를 들어, 다음 구성을 사용하면 react v17은 button v2 패키지의 피어 종속성에 있거나 모든 card 패키지의 종속성에 있는 경우에만 허용됩니다:
peerDependencyRules:
allowedVersions:
"button@2>react": "17",
"card>react": "17"
peerDependencyRules.allowAny#
allowAny는 패키지 이름 패턴의 배열이며, 패턴과 일치하는 모든 피어 종속성은 peerDependencies에 지정된 범위와 관계없이 모든 버전에서 해석됩니다. 예를 들어:
peerDependencyRules:
allowAny:
- "@babel/*"
- "eslint"
위 설정은 @babel/ 패키지 또는 eslint와 관련된 피어 종속성 버전 불일치에 대한 모든 경고를 표시하지 않습니다.