npm install에 --force와 --legacy-peer-deps는 뭘까?

쭌로그·2025년 2월 20일
3

소개

사내 프로젝트에서 옛날 프로젝트의 라이브러리를 받거나 인프런의 올라와 있는 옛날 버전의 라이브러리를 다운받다보면 자주 접하게 되는 Npm 에러가 있습니다.

npm ERR! Fix the upstream dependency conflict, or retry
npm ERR! this command with --force, or --legacy-peer-deps
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.

해석하자면 dependency conflict, 라이브러리 참조가 잘못되었다는 에러입니다. 이를 해결하기 위해서는
--force 또는 --legacy-peer-deps 옵션을 추가하면 해결된다고합니다.

막상 사용하고 보니 --force 옵션은 무엇인지, --legacy-peer-deps 옵션은 무엇인지 궁금해져 정리해보려고합니다.

이슈가 생긴 이유

NPM 7
찾아보니 Npm 7부터 생긴 이슈라고 합니다.
npm 6에서는 --legacy-peer-deps와 비슷한 방식으로 자동 설치되었으나 npm7부터 차단시킨다고 기록되어 있습니다.

1. --force

--force 옵션은 모든 peer dependencies 충돌을 무시하고 강제로 설치합니다.

왜 필요할까?
1. 패키치의 의존성이 맞지 않지만 강제로 설치해야 하는 경우
2. 빠르게 라이브러리를 설치하고 로컬에서만 사용할 때

주의
--force 옵션은 말 그대로 강제로 설치하는 작업입니다. 때문에 무작정 설치한다면 종석성 트리가 깨져 장애가 발생할 수 있습니다. 설치를 완료한 후에도 dependency conflict 경고가 출력되기 때문에 반드시 배포 전에 충분한 테스트가 필요합니다.

2. --legacy-peer-deps

npm 7에서 도입된 엄격한 검증을 비활성화하는 옵션입니다. --legacy-peer-depssms npm 6과 같은 방식으로 작동하게 하는 옵션입니다.

왜 필요할까?
1. 오래된 프로젝트에서 라이브러리를 설치해야하는 경우

--legacy-peer-deps의 경우에도 종속성 오류가 발생할 수 있습니다. 때문에 충분한 테스트 후 배포를 진행해야합니다.

상황 재현하기

가상 프로젝트로 dependency conflict를 재현하고 두 옵션을 사용해보겠습니다.

위 패키지로 실행을 진행하면 에러가 발생합니다. next 15는 react 18이상부터 지원하기 때문입니다. 위 dependency 트리로 --force와 --legacy-peer-deps옵션을 사용해서 설치하겠습니다.

1. --force

{
  "name": "my-project",
  "dependencies": {
    "package-a": "^1.0.0",
    "package-b": "^2.0.0"
  }
}
{
  "name": "package-a",
  "version": "1.0.0",
  "dependencies": {
    "lodash": "^4.17.21"
  }
}
{
  "name": "package-b",
  "version": "2.0.0",
  "dependencies": {
    "lodash": "^3.10.1"
  }
}

npm i --force

package-a는 lodash@4.17.21을 필요로 하지만, package-b는 이전 버전인 lodash@3.10.1을 필요로 합니다. 때문에 npm install 실행 시, 충돌로 인해 설치 실패하게됩니다.
이 때, npm i --force를 실행하면 패키지는 전부 설치되지만 에러가 발생할 위험이 있습니다.

2. --legacy-peer-deps

{
  "name": "my-project",
  "dependencies": {
    "react": "^18.2.0",
    "some-ui-library": "^2.0.0"
  }
}
{
  "name": "some-ui-library",
  "version": "2.0.0",
  "peerDependencies": {
    "react": "^17.0.0"
  }
}

npm i --legacy-peer-deps

내 프로젝트는 React 18을 사용하고 있지만, some-ui-library는 React 17만 지원하도록 설정되어 있습니다.
때문에 npm install 실행 시, peer dependency 충돌 오류 발생합니다.
이 때,

npm install some-ui-library --legacy-peer-deps

위 명령어를 입력하면 패키지가 설치됩니다. 하지만 라이브러리가 정상적으로 동작하지 않을 수 있기 때문에 꼭 테스트를 해야합니다.

마무리

오늘은 종속성 문제를 건너뛸 수 있는 --force와 --legacy-peer-dependency 방법을 알아보았습니다. 두 옵션은 문제를 해결하기 위한 것이 아닌, 문제를 건너 뛰기 위한 옵션이므로 항상 테스트 후 처리하는게 필요합니다.

profile
매일 발전하는 프론트엔드 개발자

0개의 댓글