방금 최근에 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.0
package.json
package-lock.json
package-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 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
기존 프로젝트를 지금 설치할 때 사용해야하는 명령입니다.
