peerDependencies 와 overrides 의 차이점(package management)
바로 요약
- peerDependencies - 다른 패키지들의 의존 관계도 만족되는 경우에만 peerDependencies 의 설정된 버전이 사용된다.
- overrides - 의존 관계와 상관없이 overrides 를 사용하면 항상 설정된 버전이 사용된다.
패키지 관리에서 peerDependencies와 overrides의 차이는 버전 처리 및 강제 적용 방식에 관한 것입니다.
아래는 그 차이에 대한 설명입니다:
peerDependencies
• 목적: 주로 패키지가 호스트 프로젝트(또는 다른 라이브러리)가 특정 버전의 의존성을 제공할 것으로 기대할 때 사용됩니다.
• 버전 유연성: peerDependencies는 의존성을 자체적으로 설치하지 않습니다. 대신, 호스트 애플리케이션이 사용해야 하는 요구된 버전 범위를 명시합니다.
• 강제 적용: 호스트 프로젝트가 명시된 버전을 충족하지 않으면, 패키지 관리자는(npm과 같은) 경고를 표시합니다. 최근 버전의 npm(7버전 이상)에서는 peerDependencies가 자동으로 설치될 수 있지만, 오직 다른 의존성과 호환되는 버전일 경우에만 설치됩니다. 특정 버전을 “강제”하는 것이 아니라 요청하는 방식입니다.
예시:
// package.json
{
"peerDependencies": {
"react": "^17.0.0"
}
}
이 예시에서, 패키지는 프로젝트가 React 17 버전 이상 또는 호환되는 버전을 사용하기를 기대하지만, React 자체는 설치하지 않습니다. 사용자는 해당 범위를 충족하는 버전의 React를 설치해야 하며, 그렇지 않으면 경고를 받게 됩니다.
overrides(npm에서는 overrides, Yarn에서는 resolutions)
• 목적: overrides는 의존성의 특정 버전을 강제로 사용하도록 설정할 수 있습니다. 다른 패키지가 충돌하는 요구 사항을 가지더라도 이를 강제할 수 있습니다.
• 강제 적용: 이 접근 방식은 peerDependencies보다 더 공격적입니다. 프로젝트의 모든 패키지가 명시된 버전을 사용하도록 강제하며, 각 패키지가 요구하는 의존성 버전과 관계없이 적용됩니다.
• 일반적인 사용 사례: monorepo에서나 의존성 버전에서 알려진 문제가 있을 때, 다른 버전을 강제로 사용하도록 설정하여 문제를 우회하고자 할 때 유용합니다.
예시:
// package.json
{
"overrides": {
"react": "17.0.2"
}
}
이 설정이 있으면, npm은 프로젝트 내의 모든 React 인스턴스가 버전 17.0.2를 사용하도록 보장합니다. 다른 패키지가 다른 버전을 명시하더라도 관계없이 강제로 17.0.2 버전으로 맞춰집니다.
어떤 상황에서 사용할까요
• peerDependencies는 패키지가 소비하는 프로젝트에서 제공하는 다른 의존성의 호환 가능한 버전이 필요할 때 사용합니다. 이 경우 해당 의존성을 직접 설치하지 않고, 사용자가 직접 설치하도록 요구합니다.
• overrides는 특정 버전에 대해 엄격한 제어가 필요하고, 프로젝트 전체에서 이 버전을 강제로 사용해야 할 때 사용합니다. 특히 peerDependencies로 해결할 수 없는 버전 충돌을 해결해야 할 때 유용합니다.
버전을 엄격하게 제어하고 싶다면 overrides를 사용하고,
호환성 범위를 지정하고 메인 프로젝트가 결정하도록 하려면 peerDependencies를 사용하세요.