아마도 다음과 같은 것이 있습니다.
"typescript":"~2.1.6"
귀하의 package.json
npm이 최신 부 버전으로 업데이트되는 경우2.4.1
편집 : OP의 질문
그러나 "npm install"이 잠금 파일을 변경하는 이유는 설명하지 않습니다. 잠금 파일이 재현 가능한 빌드를 작성하기위한 것이 아닙니까? 그렇다면 semver 값에 관계없이 여전히 동일한 2.1.6 버전을 사용해야합니다.
대답:
이것은 전체 종속성 트리를 잠그기위한 것입니다. typescript v2.4.1
필요 하다고 가정 해 봅시다 widget ~v1.0.0
. 당신이 npm을 설치할 때 그것을 잡는다 widget v1.0.0
. 나중에 동료 개발자 (또는 CI 빌드)에서 npm을 설치하고 로 업데이트 typescript v2.4.1
되었지만 widget
로 업데이트되었습니다 widget v1.0.1
. 이제 노드 모듈이 동기화되지 않았습니다. 이것이 package-lock.json
방지하는 것입니다.
또는 더 일반적으로 :
예를 들어,
패키지 A :
{ "name": "A", "version": "0.1.0", "dependencies": { "B": "<0.1.0"}}
패키지 B :
{ "name": "B", "version": "0.0.1", "dependencies": { "C": "<0.1.0"}}
패키지 C :
{ "name": "C", "version": "0.0.1"}
이들이 레지스트리에서 사용 가능한 A, B 및 C의 유일한 버전 인 경우 일반 npm 설치 A가 설치됩니다.
A@0.1.0-B@0.0.1-C@0.0.1
그러나 B@0.0.2가 게시되면 새로운 npm 설치 A가 설치됩니다.
새 버전이 B의 종속성을 수정하지 않았다고 가정하면 A@0.1.0-B@0.0.2-C@0.0.1입니다. 물론, 새로운 버전의 B는 새로운 버전의 C와 수많은 새로운 의존성을 포함 할 수 있습니다. 이러한 변경이 바람직하지 않은 경우 A 작성자는 B@0.0.1에 대한 종속성을 지정할 수 있습니다. 그러나 A의 저자와 B의 저자가 같은 사람이 아닌 경우 A의 저자는 B가 전혀 바뀌지 않았을 때 새로 게시 된 C 버전을 가져오고 싶지 않다고 말할 방법이 없습니다.
OP 질문 2 : 알겠습니다. 당신이 말하는 것은 잠금 파일이 보조 종속성의 버전을 지정하지만 최상위 종속성을 결정하기 위해 package.json의 퍼지 일치에 여전히 의존한다는 것입니다. 정확합니까?
답변 : 아니요. package-lock은에서 설명한 루트 패키지를 포함하여 전체 패키지 트리를 잠급니다 package.json
. 만약typescript
에 잠겨2.4.1
당신에 package-lock.json
이 변경 될 때까지, 그 방법을 유지해야한다. 그리고 내일 typescript
출시 버전 이라고 말해 보자 2.4.2
. 지점을 체크 아웃하고 실행 npm install
하면 npm은 잠금 파일을 존중하고 설치 2.4.1
합니다.
더 package-lock.json
:
npm이 node_modules 트리 또는 package.json을 수정하는 모든 작업에 대해 package-lock.json이 자동으로 생성됩니다. 후속 설치가 중간 종속성 업데이트에 관계없이 동일한 트리를 생성 할 수 있도록 생성 된 정확한 트리를 설명합니다.
이 파일은 소스 리포지토리에 커밋되어 다양한 목적으로 사용됩니다.
팀원, 배포 및 지속적인 통합이 정확히 동일한 종속성을 설치하도록 종속성 트리의 단일 표현을 설명하십시오.
디렉토리 자체를 커밋하지 않고도 사용자가 node_modules의 이전 상태로 "시간 여행"할 수있는 기능을 제공합니다.
읽을 수있는 소스 제어 차이를 통해 트리 변경의 가시성을 향상시킵니다.
또한 npm이 이전에 설치된 패키지에 대해 반복되는 메타 데이터 분석을 건너 뛰도록하여 설치 프로세스를 최적화하십시오.
https://docs.npmjs.com/files/package-lock.json