npm-shrinkwrap.json과 package-lock.json의 차이점은 무엇입니까?


158

npm @ 5출시package-lock.json 되면 npm-shrinkwrap.json이미 존재 하지 않는 한 이제는 씁니다 .

다음을 통해 전 세계적으로 npm @ 5를 설치했습니다.

npm install npm@5 -g

그리고 지금 npm-shrinkwrap.json다음 중에 a 가 발견 되면 :

npm install

경고가 인쇄됩니다 :

npm WARN read-shrinkwrap This version of npm
is compatible with lockfileVersion@1,
but npm-shrinkwrap.json was generated for lockfileVersion@0.
I'll try to do my best with it!

따라서 테이크 아웃을 수축 랩을로 교체해야합니다 package-lock.json.

그러나 왜 새로운 형식이 있습니까? 할 수없는 package-lock.json일이 무엇입니까 npm-shrinkwrap.json?

답변:


176

파일의 내용은 정확히 동일하지만 문서 사이트npm 저장소의 문서 파일에 설명되어있는 npm이 파일을 처리하는 방법에는 몇 가지 차이점 이 있습니다 .

  • package-lock.jsonnpm에 게시되지 않지만 npm-shrinkwrap기본적으로는
  • package-lock.json 최상위 패키지에없는 파일은 무시되지만 종속성에 속하는 shrinkwrap 파일은 존중됩니다
  • npm-shrinkwrap.jsonnpm 버전 2, 3 및 4와 역 호환되지만 package-lock.jsonnpm 5 이상에서만 인식됩니다.

을 실행 하여 기존 package-lock.json을 로 변환 할 수 있습니다 .npm-shrinkwrap.jsonnpm shrinkwrap

그러므로:

  • 패키지를 npm에 게시하지 않는 경우이 두 파일 중에서 선택해도 아무런 영향이 없습니다. package-lock.json기본값이며 npm 초보자에게는 이름이 명확하기 때문에 사용할 수 있습니다 . 또는 npm-shrinkwrap.json개발 팀의 모든 사람이 npm 5 이상인지 확인하기 어려운 경우 npm 2-4와의 하위 호환성을 위해 사용할 수 있습니다 . (npm 5는 2017 년 5 월 25 일에 출시되었습니다. 대부분의 사람들은 결국 업그레이드 할 예정이므로 이전 버전과의 호환성은 점점 중요 해지고 있습니다.)
  • 당신이하면 된다 NPM에 패키지를 게시, 당신은 사이에서 선택할 수 있습니다 :

    1. 를 사용하여 package-lock.json설치 한 종속성의 버전을 정확히 기록하지만 패키지를 설치하는 사용자가에 의해 지정된 버전 범위와 호환되는 모든 버전의 종속성을 사용할 수 있도록합니다 package.json.
    2. 사용하여 npm-shrinkwrap.json패키지를 설치하는 모든 사람이 얻을 보장하기 위해 정확하게 모든 종속성의 동일한 버전


    문서에서 (매우 자세하게) 설명 된 공식 견해는 라이브러리에 옵션 1을 사용해야한다는 것입니다 (아마도 많은 패키지 종속성이 모두 동일한 보조 종속성의 약간 다른 버전에 의존 할 때 발생하는 패키지 복제 양을 줄이기 위해) 하지만 옵션 2는 전 세계에 설치 될 실행 파일에 적합 할 수 있습니다.


2
+1-두 번째 글 머리표를 명확히 할 수 있습니까? 그 행동과 npm-shrinkwrap의 차이점은 무엇입니까?
Rhys

2
@Rhys 두 번째 글 머리 기호는 이상한 일을하지 않으면 실제로 중요하지 않습니다. 기본적으로, 그것은 단지 라이브러리가 어떻게 든 경우에 있다고 했다 게시 package-lock.json하면 다른 패키지의 종속성으로 해당 라이브러리를 설치한다면 (이)로 이용 가능하고, 도서관이 package-lock.jsonNPM에 의해 무시 될 것이다. 그러나, 라이브러리가 발행하는 경우 npm-shrinkwrap.json, 당신은 당신이되며, 종속성으로 라이브러리를 설치 또한 보조 종속으로 설치 정확한 버전의 도서관에 지정된 모든 종속성 npm-shrinkwrap.json.
Mark Amery

읽기 전용 npm ci설치를 보장하기 위해 존재하는 것을 추가 할 수 있습니까? package-lock.json( npm install변이 package-lock.json일으키는 혼란과 잠재적 인 버그와 이용하지 않는 package-lock.json그 자체를.)
k0pernikus

@ k0pernikus npm ci처리 방법 npm-shrinkwrap.json과 차이점에 차이가 없다고 생각 package-lock.json합니다. 두 파일의 차이점에 대한이 질문과 관련이 있습니까? 또한, 주위 읽은 후 : 내가 생각 " npm install...의 장점하지 않는다 package-lock.json" NPM 5.4 이래로 거짓을 - 내가 믿는 npm install지금 당신을 존중 package-lock 하지 않는 한 그것은 당신과 함께 철저하게 호환의 package.json경우에 후자가 우선합니다. (- 내가 뭔가를 놓친 거지하지만 약간의 자바 스크립트의 세계에 빠져 있었어?)
마크 Amery

27

NPM 개발자의 설명 :

이 아이디어는 package-lock.json이 슈 링크 랩 기술에서 가장 최신이자 가장 위대한 것으로, npm-shrinkwrap.json이 정확한 node_modules를 가진 라이브러리에 매우 관심이있는 귀중한 소수의 사람들을 위해 예약 된 것입니다. npm @> = 2를 사용하여 CI가 npm 버전을 충돌시키지 않고 특정 트리를 설치하도록 CI를 원하는 사람들을 위해.

새로운 잠금 파일 ( "package-lock.json")은 기본적으로 npm-shrinkwrap과 동일한 형식으로 동일한 코드를 모두 공유합니다 (서로 이름을 바꿀 수 있습니다). 또한 커뮤니티가 이해하는 것입니다. "잠금 파일이 있습니다"는 사람들의 클릭 속도가 훨씬 빠릅니다. 마지막으로, 새로운 파일이 있다는 것은 부모 게시물에 언급 된 allow-publication과 같은 이상한 일을하지 않고도 수축 포장으로 비교적 낮은 위험을 거꾸로 할 수 있음을 의미했습니다.


18
나는 아직도 그 차이에 대해 명확하지 않다. 경우는 npm-shrinkwrap내가 맡기 .... 정확한 node_modules입니다 package-lock.json덜 정확한 이상의 잠금입니까? 그렇다면 잠금이 아닌 것은 무엇 npm-shrinkwrap입니까?
dman

@dman에 문제가 있습니다. package-lock은 npm-shrinkwrap의 새로운 버전입니다. package-lock은 옵트 아웃 (기본적으로 활성화되어 있기 때문에 기능을 제거해야 함), npm-shrinkwrap은 옵트 인 (내 기본값이 포함되어 있지 않으므로 활성화해야 함) 그들이 패키지 잠금을 도입 한 이유는 1. 기본적으로 활성화되어 있기 때문에 사용자가 종속성을 처리 할 수있는 절약 방법을 가지고 있기 때문입니다. 2.이 이름은 "shrinkwrap"이 아닌 것을 의미합니다. npm-shrinkwrap에는 현재 package-lock에없는 특정 종속성 동작 설정이 있습니다. npm-shrinkwrap은 이제 폐기되었습니다.
SeriousM

10
이것은 올바르지 않습니다. package-lock이 npm-shrinkwrap의 새 버전이라고 말하면 대체 패키지라고 말할 수 있습니다. npm-shrinkwrap은 더 이상 사용되지 않으며 package-lock.json과 차이점이 있습니다. 또한 package-lock.json 에는 버그가 있지만 npm-shrinkwrap은 그렇지 않으므로 더 강조하여 동일한 코드가 아닙니다.
dman

또한 package-lock.json은 방해가됩니다. 따라서 "npm i"를 호출하면 shrinkwrap을 명시 적으로 생성해야하며 ci 서버에서 충돌을 일으키지 않으면 scm 충돌이 쉽게 발생할 수 있습니다. 네, 여기가 잘못 될 수 있습니다.
norekhov

@dman "package-lock.json에는 버그가 있지만 npm-shrinkwrap에는 없습니다" -아닙니다. 연결 한 문제에 대해서는 표시가 없습니다. 심지어 언급하지 않습니다 npm-shrinkwrap. 내 대답에서 알 수 있듯이 a package-lock.json를 a 로 변환 하는 npm-shrinkwrap.json것은 말 그대로 파일 이름을 바꾸면됩니다. 그것들 "같은 코드"입니다.
Mark Amery

12

아이디어는 기본적으로-저장 및 수축 포장이 발생하지만 수축 포장이 원하지 않는 곳에서 발생하는 잠재적 인 문제를 피하는 것이 었습니다. 그래서 그들은 충돌을 피하기 위해 새로운 파일 이름을 부여했습니다. npm의 누군가가 여기에 더 철저하게 설명했습니다.

https://www.reddit.com/r/javascript/comments/6dgnnq/npm_v500_released_save_by_default_lockfile_better/di3mjuk/

관련 인용문 :

npm은 기본적으로 대부분의 파일을 소스 디렉토리에 게시하며 사람들은 수년간 수축 포장을 게시 해 왔습니다. 우리는 호환성을 깨뜨리고 싶지 않았습니다. 기본적으로 --save 및 shrinkwrap을 사용하면 실수로 레지스트리를 만들어 레지스트리를 통해 전파 할 위험이 있으며 기본적으로 dep 및 dedupe를 업데이트하는 기능은 null입니다.

그래서 우리는 새로운 이름을 선택했습니다. 그리고 우리는 갑자기 새로운 이름을 선택했습니다. 새로운 잠금 파일은 기본적으로 동일한 코드, 정확히 동일한 형식을 모두 공유합니다.

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