일부 프로젝트 대상으로 사내 CI/CD 환경에서 패키지 설치 시, 다음 명령어로 설정되어 있다.
npm install --cache .npm --prefer-offline
--cache 와 --prefer-offline 플래그에 대해서 간단하게 알아보고
패키지 설치 시 사용하는 두 가지 명령어(install, ci)의 차이점과 주의사항을 간단하게 정리하자.
옵션 | 설명 |
|---|---|
| npm 캐시 디렉토리를 프로젝트 내 (CI에서 캐시 재사용 목적) |
| 캐시에 패키지가 있으면 레지스트리에 요청하지 않고 캐시에서 설치 |
npm이 패키지를 다운로드하면 기본적으로 글로벌 캐시 디렉토리(~/.npm)에 저장한다.
--cache .npm 은 현재 디렉토리의 .npm 폴더로 변경한다.
--prefer-offline은 캐시 데이터가 있으면 네트워크 요청을 하지 않고 캐시를 사용한다는 의미이다.
네트워크 요청을 줄여 설치 속도 향상이 목적이다.
그런데 우리 회사는 쿠버네티스 Pod를 사용하고 있다. 이는 일시적이다.Pod(서버로 보면됨) 생성 -> npm install --cache .npm -> Pod 종료 -> .npm 폴더 사라짐
이 과정을 보면 캐시를 로컬에 저장해봤자.. 다음 빌드에서 활용할 수 없다. 현재론 의미 없던 코드였던 것..
package.json의 semver 범위를 기준으로 설치
package-lock.json을 업데이트할 수 있음
기존 node_modules/를 유지한 채 변경분만 반영
옵션 | 설명 |
|---|---|
| npm 캐시 디렉토리를 프로젝트 내 |
package-lock.json을 정확히 그대로 설치 (lock 파일이 source of truth)
node_modules/를 삭제 후 처음부터 설치
package.json과 package-lock.json이 불일치하면 에러로 실패
lock 파일을 절대 수정하지 않음
CI에서 npm ci를 사용하는 이유는 모든 빌드가 lock 파일 기준으로 동일한 결과를 보장하기 때문
항목 |
|
|
|---|---|---|
node_modules 삭제 | 안 함 | 매번 삭제 후 재설치 |
lock 파일 수정 | 가능 | 불가 (불일치 시 에러) |
속도 (캐시 있을 때) | 빠름 | 클린 설치라 상대적으로 느림 |
재현성 | 낮음 | 높음 (동일 결과 보장) |
용도 | 개발 중 패키지 추가/업데이트 | CI/CD에서 재현 가능한 빌드 |
npm 버전 | Node 버전 | 생성하는 lockfileVersion |
|---|---|---|
npm 6 | Node 14 | 1 |
npm 7-8 | Node 16 | 2 |
npm 9+ | Node 18+ | 3 |
로컬 환경(Node 18)에서 npm install을 실행하면 lockfileVersion: 3이 생성된다.
CI 환경(Node 14)의 npm 6은 lockfileVersion: 1만 지원하므로, lock 파일을 파싱하지 못하고 에러가 발생한다.
실제로 다음 에러가 발생했다.
npm ERR! Cannot read property '@fxts/core' of undefined