npm
작성 수정
1. npm i
- 기능:
package.json파일을 기반으로 의존성을 설치합니다. 이 명령어는 종속성이 없는 경우 새로 설치하고, 이미 설치된 종속성이 있으면 그대로 두거나 업데이트할 수 있습니다. - 주요 특징
package.json에 정의된 의존성을 설치합니다.package-lock.json파일이 있는 경우 이를 참조하여 최대한 일치하는 버전으로 설치하지만, 필요시 패키지를 업데이트할 수 있습니다.node_modules폴더가 이미 있으면 기존 패키지를 유지하거나 새 패키지를 추가/업데이트합니다.- 유연한 설치:
package-lock.json에 따라 다르게 동작할 수 있으며, 새로운 패키지나 패치 버전을 설치할 수 있습니다. - 개발 환경에서 주로 사용: 개발 중에 새로운 패키지를 추가하거나 업데이트할 때 유용합니다.
2. npm ci (Continuous Integration):
- 기능:
package-lock.json파일을 기반으로 의존성을 정확하게 재현하는 데 사용됩니다. 이 명령어는 배포 환경이나 CI/CD 환경에서 신뢰할 수 있는 의존성 설치를 보장합니다. - 주요 특징
package-lock.json에 정의된 의존성 버전 그대로 설치:npm ci는package-lock.json파일에 정의된 대로 의존성을 설치합니다. 이로 인해 완전히 동일한 버전의 패키지를 재현할 수 있습니다.package-lock.json이 필수:npm ci는package-lock.json파일이 없으면 동작하지 않습니다.- 기존의
node_modules폴더 삭제:npm ci는 설치 전에node_modules폴더를 모두 삭제하고 새로 설치합니다. 이로 인해 설치가 깨끗한 환경에서 진행됩니다. - 빠른 설치 속도:
npm i보다 빠르고 신뢰성 있는 설치가 가능합니다. CI/CD 파이프라인에서 매우 유용합니다. - 불필요한 업데이트 없음: 새 패키지를 설치하거나 버전을 변경하지 않습니다. 항상 고정된 의존성 버전을 사용합니다.
차이점 요약:
| 구분 | npm i | npm ci |
|---|---|---|
| 설치 대상 | package.json 기반으로 설치 | package-lock.json 기반으로 정확하게 설치 |
| 속도 | 상대적으로 느릴 수 있음 | 빠름, 항상 새로 설치 |
기존 node_modules | 유지 | 삭제 후 재설치 |
| 의존성 업데이트 | 가능 (최신 패치 버전 설치 가능) | 불가능 (고정된 버전으로 설치) |
| 사용 사례 | 개발 중 의존성 추가 및 수정 | CI/CD, 배포 환경에서 사용 |
package-lock.json 필요 여부 | 선택 사항 | 필수 |
결론
npm i- 개발 환경에서 새로운 패키지를 설치하거나
package.json만 있는 경우 유연한 설치가 필요할 때 사용합니다.
- 개발 환경에서 새로운 패키지를 설치하거나
npm ci- CI/CD 파이프라인 또는 프로덕션 배포와 같은 배포나 자동화된 빌드 환경에서 신뢰할 수 있는 일관된 의존성 설치가 필요할 때 사용합니다.
npm install @expo/webpack-config@latest --legacy-peer-deps
이 명령어를 하나씩 분석해보겠습니다:
npm install: 패키지 설치 명령어 @expo/webpack-config: 설치할 패키지 이름 @latest: 최신 버전을 설치하라는 의미 --legacy-peer-deps: 피어 의존성(peer dependency) 검사를 옛날 방식으로 하라는 플래그 특히 --legacy-peer-deps는 npm 7 이후에 중요해졌는데:
npm 7 이전: 피어 의존성 충돌이 있어도 경고만 하고 설치를 진행 npm 7 이후: 피어 의존성 충돌이 있으면 설치를 중단 --legacy-peer-deps 플래그를 사용하면:
"나는 이 의존성 충돌을 알고 있으니, npm 6 방식으로 그냥 설치해줘"라는 의미 의존성 충돌을 무시하고 강제로 설치를 진행 단, 이 플래그는 신중히 사용해야 합니다:
의존성 충돌을 무시하기 때문에 잠재적인 문제가 발생할 수 있음 하지만 이번 webpack-config 케이스처럼, 실제로는 작동할 것이 확실한 경우에는 유용
package.json
// 어떤 UI 라이브러리의 package.json
{
"name": "my-ui-lib",
"peerDependencies": {
"react": "^18.2.0" // 실제로 설치되진 않음
}
}
// 이 라이브러리를 사용하는 프로젝트의 package.json
{
"dependencies": {
"react": "^18.2.0", // 실제 React 설치
"my-ui-lib": "^1.0.0" // UI 라이브러리 설치
}
}