• npm install vs npm ci :: 마이구미
    Javascript 2021. 11. 24. 21:16
    반응형
    이 글은 npm install 과 npm ci. 명령어를 비교해본다.
    두 명령어 모두 의존성 목록을 설치하는 것이지만, 서로 다른 방향을 가진다.
    둘 사이의 차이점을 이해하면 유용하게 사용할 수 있을 것이다.
    다른 패키지 매니저(yarn) 가 아닌 npm 을 기준으로 다루게 된다.

     

     

    우선 npm install 명령어는 우리가 알다시피 특정 파일과 밀접한 관계가 있다.

     

    • package.json
    • package-lock.json

     

    두 파일을 간단하게 살펴보자.

    package.json 은 우리가 설치하고자 하는 모듈에 대한 의존성 목록이 존재한다.

    여기서 의존성 목록의 버전은 version range 를 따르고 있다. (~, ^ <=, etc)

     

    "react": "^17.0.2",

     

    version range 로 인해 발생할 수 있는 이슈는 각자 서로 다른 node_modules 를 생성할 수 있다는 것이다.

    예를 들어, 하나의 프로젝트에 여러 명의 개발자가 협업을 할 경우를 보자.

    각자의 로컬 환경에서 npm, node 버전 등이 서로 다를 수 있다.

    이러한 상황에서 각자 npm install 실행한다면, 서로 다른 버전을 가지는 모듈을 가지는 경우가 생길 수 있다.

    이러한 이슈는 로컬 환경뿐만 아니라 CI/CD 등 서로 다른 환경에 의해 발생할 수 있다.

     

    그래서 package-lock.json 이 존재한다.

    package-lock.json 은 version range 와는 다르게 정확하게 버전이 명시되어 있다.

     

    react@^17.0.2:
      version "17.0.2"

     

    위처럼 version range 가 아닌 정확하게 명시된 버전을 모두가 바라보게 된다면, 결국 모두 같은 버전의 의존성을 가지게 된다.

    이러한 이유로 package-lock.json 을 같이 커밋해서 사용하고 있는 것이다.

     


     

    npm install 과 npm ci 모두 결과적으로는 두 명령어 모두 의존성 목록을 설치하는 것이다.

    둘 사이의 차이점에 앞서, npm install 의 본질은 다음과 같다.

     

    package.json 을 읽어 의존성 목록을 만들고 package-lock.json 을 통해 설치할 의존성의 버전을 알려주는 것이다.

     

    npm install {모듈} 을 실행하면 package.json 에 의존성 목록에 추가될 것이고 package-lock.json 도 업데이트 될 것이다.

    이것이 의미하는 것은 npm install 명령어는 package.json, package-lock.json 에 모두 쓰기 권한을 가진다.

     

    반면에 npm ci 는 쓰기 권한이 없다.
    아직까지 무슨 의미인지 이해하지 않아도 된다.
    계속 읽어보자.

     

    npm ci 의 특징은 다음과 같다.

     

    • package-lock.json 이 무조건 존재해야하만 하고, 만약 없으면 에러를 낸다.
    • package-lock.json 파일을 기반으로 의존성을 설치하고, package.json 은 버전 매칭 밸리데이션 용도로 사용한다.
      즉, package-lock.json 과 package.json 사이의 버전이 매칭이 안되면 에러를 낸다.
    • npm ci 실행하면 먼저 node_modules 삭제한 후, 의존성을 한번에 설치한다.

     

    이처럼 npm install 과 달리 파일을 손대는 일은 없기에, 쓰기 권한이 없다고 언급한 것이다.

    오직 package-lock.json 을 읽고 의존성 목록을 설치하게 된다.

    이러한 흐름으로써, 개발 환경이 아닌 CI 환경에서는 npm install 보다는 적합한 방안으로 여겨진다.

     

    그리고 npm install 에 비해 npm ci 이 특정 케이스에서는 훨씬 빠르다고 말하고 있다.

    이미 버전이 정확하게 명시된 package-lock.json 을 기반으로 설치하기 때문에 설치할 버전을 알아내야하는 npm install 보다는 빠를 수 밖에 없다.

    하지만 반대로 특정 케이스에서는 느릴 수도 있다.

    언급한대로 npm ci 는 우선 node_modules 을 삭제한다고 했다.

    삭제하는 과정이 필요하기 때문에 만약에 node_modules 가 존재하고 삭제해야하는 연산이 길어진다면, npm install 보다 느릴수도 있다.

    node_modules 을 같이 커밋할 일은 없지만 CI/CD 환경에서 node_modules 을 캐시하는 경우라면 이 부분을 고려해야한다.

     

    실제 사용중인 CI/CD 환경에서도 삭제하는 시간이 생각보다 소요되서 둘 사이의 차이는 크게 없었다.

    하지만 pacekage-lock.json 을 기반으로 의존성을 설치하는 것만으로도 npm install 보다는 npm ci 가 더 적합하다고 판단하고 있다.

     


     

    마지막으로 yarn 에서도 npm ci 와 같은 기능을 제공해주고 있긴 하다.

     

    yarn install --frozen-lockfile

     

    관련 공부를 하다가 꽤 재밌는 토론을 발견해서 보면 좋을 것 같다.

    https://github.com/yarnpkg/yarn/issues/4147

     

    혹시나 잘못된 내용이 있거나, 추가할 내용들이 있다면 댓글로 남겨주시면 감사하겠다.

    반응형

    댓글 0

Designed by Tistory.