“npm install”과“npm ci”의 차이점은 무엇입니까?


215

지속적인 통합 작업을하고 npm ci 명령을 발견했습니다 .

워크 플로에이 명령을 사용하면 어떤 이점이 있는지 알 수 없습니다.

더 빠릅니까? 시험을 더 어렵게하고 괜찮게합니까?

답변:


328

로부터 NPM 워드 프로세서 :

간단히 말해 npm install과 npm ci 사용의 주요 차이점은 다음과 같습니다.

  • 프로젝트에는 기존 package-lock.json 또는 npm-shrinkwrap.json이 있어야합니다.
  • 패키지 잠금의 종속성이 package.json의 종속성과 일치하지 않으면 npm ci가 패키지 잠금을 업데이트하는 대신 오류와 함께 종료됩니다.
  • npm ci는 한 번에 전체 프로젝트 만 설치할 수 있습니다.이 명령으로 개별 종속성을 추가 할 수 없습니다.
  • node_modules가 이미 있으면 npm ci가 설치를 시작하기 전에 자동으로 제거됩니다.
  • package.json 또는 패키지 잠금에 쓰지 않습니다. 설치는 기본적으로 정지됩니다.

기본적으로, 종속성 목록을 작성하기 위해 npm install읽고 이러한 종속성의 버전을 설치하는 데 사용합니다. 종속성이 없으면에 의해 추가됩니다 .package.jsonpackage-lock.jsonpackage-lock.jsonnpm install

npm ci(이름을 딴 C ontinuous I의 ntegration가)에서 직접 종속성을 설치 package-lock.json및 사용 package.json에는 일치하지 않는 버전이 없는지 만 확인하려면. 종속성이 없거나 호환되지 않는 버전이 있으면 오류가 발생합니다. 합니다.

npm install새 종속성을 추가하고 프로젝트의 종속성을 업데이트하는 데 사용하십시오 . 일반적으로 종속성 목록을 업데이트하는 변경 사항을 가져온 후 개발 중에이를 사용하지만 npm ci이 경우 에 사용하는 것이 좋습니다 .

npm ci결정적이고 반복 가능한 빌드가 필요한 경우 사용하십시오 . 예를 들어 지속적인 통합, 자동화 된 작업 등에서 및 대신 종속성을 처음 설치할 때가 npm install있습니다.

npm install

  • 패키지 및 모든 해당 종속성을 설치합니다.
  • 종속성은 npm-shrinkwrap.jsonpackage-lock.json(순서대로) 구동됩니다 .
  • 인수없이 : 로컬 모듈의 종속성을 설치합니다.
  • 글로벌 패키지를 설치할 수 있습니다.
  • 에 누락 된 종속성이 설치됩니다 node_modules.
  • package.json또는에 쓸 수 있습니다 package-lock.json.
    • 인수 ( npm i packagename) 와 함께 사용 package.json하면 종속성을 추가하거나 업데이트 하기 위해 쓸 수 있습니다 .
    • 인수없이 사용하면 ( npm i) package-lock.json이 파일에없는 일부 종속성 버전을 잠그기 위해 쓸 수 있습니다.

npm ci

  • npm v5.7.1 이상이 필요합니다 .
  • 필요 package-lock.json하거나 npm-shrinkwrap.json존재 해야합니다 .
  • 이 두 파일의 종속성이 일치하지 않으면 오류가 발생합니다 package.json.
  • 모든 종속성 을 한 번에 제거 node_modules하고 설치 합니다 .
  • package.json또는에 쓰지 않습니다 package-lock.json.

연산

상태 npm ci에서 전체 종속성 트리를 생성 package-lock.json하거나 npm-shrinkwrap.json, npm install 내용 업데이트node_modules 다음 알고리즘 (사용 소스 ) :

load the existing node_modules tree from disk
clone the tree
fetch the package.json and assorted metadata and add it to the clone
walk the clone and add any missing dependencies
  dependencies will be added as close to the top as is possible
  without breaking any other modules
compare the original tree with the cloned tree and make a list of
actions to take to convert one to the other
execute all of the actions, deepest first
  kinds of actions are install, update, remove and move

1
npm installpackage.json에 쓸 수 있는지 몰랐습니다 . 여기에 무엇을 쓸 수 있는지 알고 있습니까?
Veve

5
잘 오해의 소지가 있습니다 ... 의존성을 설치, 업데이트 또는 제거 할 때 package.json에 쓸 것입니다. 본문에서 더 명확하게 설명하겠습니다. 감사합니다!
lucascaro

이 알고리즘은 어디에 기록되어 있습니까? 즉, 소스가 무엇입니까?
Yngvar Kristiansen 2016

1
@YngvarKristiansen 그것은 npm 문서에 있으며, 참조를 위해 특정 섹션에 대한 링크를 추가했습니다
lucascaro

4
npm install package모두를 수정할 수 package-lock.json 하고 package.json 있는 동안, npm installwhithout 인수는 수정할 것package-lock.json
knobo

20

npm ci기존 node_modules 폴더를 삭제하고 package-lock.json파일을 사용하여 각 패키지의 특정 버전을 설치합니다. 일부 기능을 건너 뛰기 때문에 npm 설치보다 훨씬 빠릅니다. 깨끗한 상태 설치는 ci / cd 파이프 라인 및 도커 빌드에 적합합니다! 또한 특정 패키지가 아닌 모든 것을 한 번에 설치하는 데 사용합니다.


9

연결 한 문서에는 다음과 같은 요약이 있습니다.

간단히 말해 npm install과 npm ci 사용의 주요 차이점은 다음과 같습니다.

  • 프로젝트에는 기존 package-lock.json 또는 npm-shrinkwrap.json이 있어야합니다.
  • 패키지 잠금의 종속성이 package.json의 종속성과 일치하지 않으면 npm ci가 패키지 잠금을 업데이트하는 대신 오류와 함께 종료됩니다.
  • npm ci는 한 번에 전체 프로젝트 만 설치할 수 있습니다.이 명령으로 개별 종속성을 추가 할 수 없습니다.
  • node_modules가 이미 있으면 npm ci가 설치를 시작하기 전에 자동으로 제거됩니다.
  • package.json 또는 패키지 잠금에 쓰지 않습니다. 설치는 기본적으로 정지됩니다.

2

명령은 기능면에서 매우 유사하지만 차이점은 사용자 package.jsonpackage-lock.json파일에 지정된 종속성을 설치하는 방법에 있습니다.

npm ci앱의 모든 종속성을 새로 설치하지만 npm install시스템에 이미 존재하는 경우 일부 설치를 건너 뛸 수 있습니다. 시스템에 이미 설치된 버전이 설치하려는 버전이 아닌 경우, package.json즉 설치된 버전이 ' 필수 '버전 과 다른 경우 문제가 발생할 수 있습니다 .

다른 차이점은 파일을 npm ci건드리지 않는 것 package*.json입니다. 종속성 버전이 package.jsonpackage-lock.json파일 에서 일치하지 않으면 설치가 중지되고 오류가 표시 됩니다.

당신은 공식 문서에서 더 나은 설명 읽을 수 있습니다 여기를 .

또한 여기에서 패키지 잠금에 대해 읽으 십시오 .


1

그것은 고산 같은 빛 노드 고정 표시기 이미지는 파이썬의 종속성 인 설치하지 않는 것이 마음에 가진 가치 node-gyp에 의해 사용되는 npm ci.

나는 npm ci일 하기 위해서는 파이썬을 빌드에서 의존성으로 설치해야 한다고 생각합니다 .

자세한 내용은 여기 Docker 및 npm-gyp ERR! 괜찮아


0

다른 사람들은 기술적 차이에 대답했지만 어떤 상황에서 두 가지를 모두 사용하는지 설명하지 않습니다.

다른 상황에서 사용해야합니다.

npm installnode_modules디렉토리 를 캐시하려는 경우 개발 및 CI에 유용합니다 . 이것을 언제 사용합니까? 다른 사람이 사용할 수 있도록 패키지를 만드는 경우 ( node_modules이러한 릴리스 에는 포함되지 않음)이 작업을 수행 할 수 있습니다. 캐싱과 관련하여 런타임 요구 사항의 차이로 인해 다시 설치해야 할 다른 버전의 Node.js기억 을 지원하려는 경우주의 하십시오 . 한 버전을 고수하려면 최신 버전을 고수하십시오 .node_modulesNode.jsLTS

npm ci설치가 가능한 한 결정적이어야하므로이 응용 프로그램은 최종 응용 프로그램 (다른 패키지에서 사용하지 않는 최종 제품)을 테스트 및 릴리스 할 때 사용해야합니다. 보다 안정적인 응용 프로그램 ( node_modules이러한 릴리스에 포함) . 의 LTS버전을 고수하십시오 Node.js.

보너스 : 얼마나 복잡한 지에 따라 혼합 할 수 있습니다. 의 기능 분기를 git캐시 node_modules하여 팀 생산성을 높이고 병합 요청 및 마스터 분기 npm ci를 통해 결정적인 결과를 얻을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.