현록

npm ci란?

이슈를 마주쳤을 때, 구글링을 하다보면
가끔 npm ci를 사용하라는 솔루션을 만나고는 했다.

오늘은 npm ci에 대해 좀 더 알아보자.

ci의 의미는 무엇인가요?

npm ci에서 ci는 보통 clean install의 의미로 설명된다.
이름처럼 기존 node_modules를 지우고 lock 파일을 기준으로 깨끗하게 의존성을 다시 설치한다.

언제 주로 사용하나요?

npm ci는 여러 환경에서 같은 결과를 반복해서 만들어야 할 때 잘 맞는다.

  • CI에서 테스트를 실행할 때
  • 배포 환경에서 의존성을 설치할 때
  • lock 파일 기준으로 재현 가능한 설치가 필요할 때
  • 로컬 의존성 상태를 한번 깨끗하게 맞추고 싶을 때

핵심은 package.json의 범위를 다시 해석하기보다는 lock 파일에 기록된 의존성 트리를 그대로 설치한다는 점이다.

npm install과 다른 점은?

package-lock.json이 필요하다.

npm cipackage-lock.json이나 npm-shrinkwrap.json 같은 lock 파일이 있어야 사용할 수 있다.
lock 파일이 없다면 npm install처럼 새 lock 파일을 만들어주는 대신 오류로 종료된다.

package.json과 lock 파일이 맞아야 한다.

package.json의 의존성 선언과 lock 파일의 내용이 맞지 않으면 npm ci는 lock 파일을 고치지 않는다.
대신 오류를 내고 종료한다.

이 차이가 CI 환경에서 중요하다.
개발자가 의존성을 바꾸고 lock 파일을 커밋하지 않았다면 CI에서 바로 실패하므로, 배포 전에 의존성 상태가 어긋난 것을 알 수 있다.

node_modules를 먼저 지운다.

node_modules 폴더가 이미 있다면 npm ci는 설치 전에 해당 폴더를 제거한다.
그래서 이전 설치 결과나 로컬에서 꼬인 의존성의 영향을 덜 받는다.

package.json과 lock 파일을 수정하지 않는다.

npm install은 상황에 따라 package-lock.json을 갱신할 수 있다.
반면 npm ci는 프로젝트의 package.json과 lock 파일을 수정하지 않는다.

.npmrc 플래그를 맞춰야 하는 경우

lock 파일을 만들 때 legacy-peer-deps, install-links처럼 의존성 트리 모양에 영향을 주는 옵션을 사용했다면, npm ci를 실행할 때도 같은 옵션을 사용해야 한다.

이런 옵션을 매번 명령어에 붙이기보다는 프로젝트의 .npmrc에 저장하고 함께 커밋하는 편이 좋다.

legacy-peer-deps=true

그렇지 않으면 로컬에서 만든 lock 파일은 멀쩡해 보이는데 CI의 npm ci에서만 설치가 실패하는 상황을 만날 수 있다.

정리

npm install은 의존성을 추가하거나 lock 파일을 갱신할 때 사용하고,
npm ci는 이미 확정된 lock 파일을 기준으로 빠르고 재현 가능하게 설치할 때 사용한다고 생각하면 된다.

참고 자료

관련 포스트
npm outdated와 npm update 차이 thumbnail
npm outdated와 npm update 차이
npm outdated와 npm update의 차이를 초보자 기준으로 정리합니다. Current, Wanted, Latest의 의미와 semver 범위 안에서 업데이트되는 방식, package-lock.json 변화까지 함께 봅니다.
npm install -g와 npx 차이 thumbnail
npm install -g와 npx 차이
npm install -g와 npx의 차이를 초보자 기준으로 정리합니다. 전역 설치, 로컬 설치, 일회성 실행, 프로젝트 scripts에 넣는 기준까지 함께 봅니다.
package.json에서 ^와 ~ 차이 thumbnail
package.json에서 ^와 ~ 차이
package.json 의존성 버전 앞에 붙는 ^와 ~의 차이를 초보자 기준으로 정리합니다. semantic versioning, 버전 범위, 0.x 예외, package-lock.json과의 관계까지 함께 봅니다.
npx와 npm exec 차이 thumbnail
npx와 npm exec 차이
npx와 npm exec가 어떤 명령어인지 초보자 기준으로 정리합니다. 로컬 패키지 실행, 원격 패키지 임시 실행, --package 옵션, -- 인자 전달 차이까지 함께 봅니다.
package.json scripts와 npm run 정리 thumbnail
package.json scripts와 npm run 정리
package.json의 scripts와 npm run 명령어를 초보자 기준으로 정리합니다. npm run dev, npm start, npm test, node_modules/.bin, -- 인자 전달 방식까지 함께 봅니다.
dependencies와 devDependencies 차이 thumbnail
dependencies와 devDependencies 차이
package.json의 dependencies와 devDependencies 차이를 초보자 기준으로 정리합니다. npm install과 npm install -D, 배포 환경 설치, package-lock.json과의 관계까지 함께 봅니다.
.npmrc 파일이란? thumbnail
.npmrc 파일이란?
storybook을 사용해보려고 하다 마주한 이슈의 해결법을 알아보다가 등장한 .npmrc라는 파일에 대해 공부해보았다. .npmrc 파일이란? .npmrc 파일은 npm에 대한 config 파일이다. (npm에 대한 rc 파일) 프로젝트별 registry, install 옵션, 인증 토큰처럼 npm CLI가 읽는 설정을 관리할 때 사용한다.
스토리북이란? thumbnail
스토리북이란?
Storybook은 UI 컴포넌트를 독립적으로 개발하고, 문서화하고, 테스트하기 위한 프론트엔드 워크샵입니다. Storybook 10.4 기준 설치 흐름과 stories, 문서화, 테스트 활용 방식을 정리합니다.
TTV와 TTI란? thumbnail
TTV와 TTI란?
TTV는 Time to View이며, 사용자가 화면을 보는 시점을 의미한다. TTI는 Time to Interact이며, 사용자가 웹에서 특정 동작을 수행할 수 있는 시점을 의미한다.
Maria DB 외부 접속 설정하기 thumbnail
Maria DB 외부 접속 설정하기
안녕하세요. 오늘은 Maria DB 초기 세팅 시, 외부에서 접속이 안될 때 매뉴얼을 작성해보겠습니다. dotenv 패키지를 통해서 환경변수로 관리한다면, 별도의 추가 작업을 할 일이 없으실 겁니다.
package-lock.json 파일의 역할 thumbnail
package-lock.json 파일의 역할
안녕하세요. 오늘은 node 환경의 개발자라면 한번쯤 궁금했을만한 package-lock.json의 역할에 대해 알아보겠습니다. 우리는 node 환경에서 개발을 할 때 다양한 패키지들을 설치하여 활용하곤 합니다. 우리가 설치하는 패키지 또한 다른 npm 패키지를 활용하여 만든 패키지들이고 이들 또한 설치를 하게 됩니다. 이렇게 직간접적으로 설치된 패키지들은 대부분 호환성을 "^1.1.5"와 같이 표현하여, 범위로 지정해두고 있습니다.
Linux 환경 배포 자동화 체험해보기 thumbnail
Linux 환경 배포 자동화 체험해보기
안녕하세요. 요즘 포트폴리오를 만들면서 서버 상에 자주 반영할 일이 생겼는데, 매번 명령어들을 타이핑하는 것이 비효율적이라 생각이 들어 배포 자동화를 생각해보게 되었습니다. 현재 레벨에서는 단순히 명령어들만 단축시켜도 효율적이라 생각이 들어 간단한 쉘 스크립트만 작성하였습니다. 정말 간단하니 여러분도 도전해보시길 바랍니다.
협업 필수품. Prettier thumbnail
협업 필수품. Prettier
안녕하세요. 오늘은 Prettier이라는 도구에 대해 알려드리고자 합니다. 개발자는 각자의 코딩스타일이 존재합니다. 그러다보니 같은 프로젝트에서도 작성하는 소스마다 스타일이 제각기 다르기 일쑤입니다. 그럴 때 도입하면 좋은 것이 Prettier입니다. 프로젝트 root 폴더에 .prettierrc 라는 파일을 생성한 뒤, 위 예시와 같이 원하는 옵션을 JSON 형식으로 작성해주면 됩니다.