[node.js] “npm install”이 package-lock.json을 다시 쓰는 이유는 무엇입니까?

방금 최근에 npm @ 5로 업그레이드했습니다 . 이제 package.json의 모든 것을 가진 package-lock.json 파일이 있습니다. 실행 하면 종속성 파일을 잠금 파일에서 가져 와서 node_modules 디렉토리에 설치해야 할 내용을 결정할 수 있습니다 . 이상한 점은 실제로 package-lock.json 파일을 수정하고 다시 작성한다는 것 입니다.npm install

예를 들어, 잠금 파일의 유형 스크립트는 버전 2.1.6으로 지정되었습니다 . 그런 다음 npm install명령 후 버전이 2.4.1 로 변경되었습니다 . 잠금 파일의 전체 목적을 무효화하는 것 같습니다.

내가 무엇을 놓치고 있습니까? 잠금 파일을 실제로 존중하기 위해 npm을 어떻게 얻습니까?



답변

업데이트 3 : 다른 답변도 지적했듯이 npm ci명령은 CI 컨텍스트에서 빠르고 재현 가능한 빌드를 달성하는 추가 방법으로 npm 5.7.0에 도입되었습니다. 자세한 내용은 설명서npm 블로그 를 참조하십시오 .


업데이트 2 : 설명서를 업데이트하고 명확히하는 문제GitHub 문제 # 18103 입니다.


업데이트 1 : 아래 설명 된 동작은 npm 5.4.2에서 수정되었습니다. 현재 의도 된 동작은 GitHub 문제 # 17979에 요약되어 있습니다 .


원래 답변 : 문제 # 16866 에서 설명한대로 npm 5.1.0package-lock.json 에서 동작 이 변경되었습니다 . 관찰되는 동작은 버전 5.1.0부터 npm에 의해 의도 된 것입니다.

이는 의 최신 버전이 발견 될 때마다 package.json재정의 package-lock.json할 수 있음을 의미합니다 package.json. 종속성을 효과적으로 고정하려면 이제 접두사없이 버전을 지정해야합니다. 예를 들어 또는 1.2.0대신에 버전을 작성해야합니다 . 다음의 조합 과 재생 가능한 빌드를 얻을 것입니다. 분명히 : 더 이상 루트 레벨 종속성을 잠그지 않습니다!~1.2.0^1.2.0package.jsonpackage-lock.jsonpackage-lock.json

이 디자인 결정이 좋은지 아닌지는 논란의 여지가 있지만 이슈 # 17979의 GitHub에 대한 이러한 혼란으로 인해 지속적인 논의가 진행되고 있습니다 . (제 눈에는 의심스러운 결정입니다. 최소한 그 이름 lock은 더 이상 사실이 아닙니다.)

추가 참고 사항 : npmjs.org 대신 GitHub에서 직접 패키지를 가져올 때와 같이 변경 불가능한 패키지를 지원하지 않는 레지스트리에 대한 제한 사항도 있습니다. 자세한 설명은이 패키지 잠금 설명서를 참조하십시오 .


답변

나는 NPM의 새로운 버전이 될 것입니다 것으로 나타났습니다 5.7.1 새로운 명령 npm ci에서 설치되며, package-lock.json단지

새로운 npm ci 명령은 잠금 파일에서만 설치합니다. package.json과 잠금 파일이 동기화되지 않은 경우 오류가보고됩니다.

node_modules를 버리고 처음부터 다시 작성하면 작동합니다.

node_modules로 시작하지 않으면 잠금 파일에있는 내용 만 얻을 수 있다는 것을 보장하는 것 외에도 npm 설치보다 훨씬 빠릅니다 (2x-10x!).

이름에서 알 수 있듯이 지속적인 통합 환경에 큰 도움이 될 것으로 기대합니다. 또한 git 태그를 사용하여 프로덕션 배포를 수행하는 사람들은 큰 이익을 얻을 것으로 기대합니다.


답변

새로 소개 된 사용

npm ci

npm ci는 대규모 팀에게 가장 큰 이점을 약속합니다. 개발자에게 패키지 잠금에서 “로그 오프”할 수있는 기능을 제공하면 대규모 팀간에보다 효율적인 협업이 가능하며 잠금 파일에 정확하게 설치하는 기능은 한 달에 수백 시간의 개발자 시간이 아니라도 수십 시간을 절약 할 수있어 팀이 자유롭게됩니다. 놀라운 것들을 만들고 배송하는 데 더 많은 시간을 할애합니다.

npm ci보다 빠르고 안정적인 빌드를위한 소개


답변

짧은 답변:

  • npm install package-lock.json이 package.json의 요구 사항을 충족하는 경우에만 존중합니다.
  • 이러한 요구 사항을 충족하지 않으면 패키지가 업데이트되고 패키지 잠금이 덮어 씁니다.
  • 빌드가 실패하면 패키지 잠금을 다시 작성하는 것보다을 사용하십시오 npm ci.

다음은 상황을 설명 할 수있는 시나리오입니다 (NPM 6.3.0으로 검증 됨).

package.json에서 다음과 같이 종속성을 선언합니다.

"depA": "^1.0.0"

그런 다음 다음 npm install과 같이 package-lock.json을 생성합니다.

"depA": "1.0.0"

며칠 후 “depA”의 최신 마이너 버전 (예 : “1.1.0”)이 릴리스되면 다음 사항이 적용됩니다.

npm ci       # respects only package-lock.json and installs 1.0.0

npm install  # also, respects the package-lock version and keeps 1.0.0 installed
             # (i.e. when package-lock.json exists, it overrules package.json)

다음으로 package.json을 수동으로 업데이트하여 다음을 수행하십시오.

"depA": "^1.1.0"

그런 다음 다시 실행하십시오.

npm ci      # will try to honor package-lock which says 1.0.0
            # but that does not satisfy package.json requirement of "^1.1.0"
            # so it would throw an error

npm install # installs "1.1.0" (as required by the updated package.json)
            # also rewrites package-lock.json version to "1.1.0"
            # (i.e. when package.json is modified, it overrules the package-lock.json)


답변

npm ci대신 명령을 사용하십시오 npm install.

“ci”는 “연속 통합”을 나타냅니다.

lenient package.json 파일 종속성 대신 package-lock.json 파일을 기반으로 프로젝트 종속성을 설치합니다.

팀 동료와 동일한 빌드를 생성하며 훨씬 빠릅니다.

이 블로그 게시물에서 자세한 내용을 확인할 수 있습니다 :
https://blog.npmjs.org/post/171556855892/introducing-npm-ci-for-faster-more-reliable


답변

앞으로는 --from-lock-file(또는 유사한) 플래그를 사용 하여 수정하지 않고서 설치할 있습니다 package-lock.json.

이는 재현 가능한 빌드가 중요한 CI 등의 환경에 유용합니다.

기능 추적에 대해서는 https://github.com/npm/npm/issues/18286 을 참조 하십시오 .


답변

이 문제는 npm v5.4.2에서 해결 된 것으로 보입니다.

https://github.com/npm/npm/issues/17979

(스레드의 마지막 주석으로 스크롤)

최신 정보

5.6.0에서 실제로 수정되었습니다. 5.4.2에 크로스 플랫폼 버그가있어 문제가 계속 발생했습니다.

https://github.com/npm/npm/issues/18712

업데이트 2

내 대답보기 :
https://stackoverflow.com/a/53680257/1611058

npm ci 기존 프로젝트를 지금 설치할 때 사용해야하는 명령입니다.