tech.junha.kr

노트/JavaScript

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 inpm 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 라이브러리 설치
  }
}