"npm install"이 package-lock.json을 다시 쓰는 이유는 무엇입니까?
저는 최근에 npm@5로 업그레이드했습니다.저는 이제 package.json의 모든 것이 포함된 package-lock.json 파일을 가지고 있습니다.내가 도망갈 때, 그것을 기대할 것입니다.npm install
lock 파일에서 종속성 버전을 가져와 my node_dll 디렉토리에 설치할 항목을 결정합니다.이상한 것은 그것이 실제로 내 package-lock.json 파일을 수정하고 다시 쓴다는 것입니다.
예를 들어 잠금 파일의 형식 스크립트가 버전 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에 요약되어 있습니다.
원답(5.4.2 이전): 다음의 동작package-lock.json
npm 5.1.0에서 16866호에서 논의된 바와 같이 변경되었습니다.관찰한 동작은 버전 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
직오의
새 npmci 명령은 잠금 파일에서만 설치됩니다.만약 당신의 소포라면.json과 잠금 파일이 동기화되지 않으면 오류가 보고됩니다.
node_modules를 버리고 처음부터 다시 만드는 방식으로 작동합니다.
잠금 파일에 있는 것만 얻을 수 있다는 보장 외에도 node_modules로 시작하지 않을 때 npm 설치보다 훨씬 빠릅니다(2x-10x!).
이름에서 따온 것처럼 지속적인 통합 환경에 큰 도움이 될 것으로 기대합니다.우리는 또한 git tag에서 생산을 하는 사람들이 큰 이득을 볼 것으로 기대합니다.
단답:
npm install
package-lock.json() 패키지의 사항을 에만 package-lock()을 합니다.json의 요구 사항을 충족하는 경우에만 package-lock.json을 준수합니다.- 이러한 요구 사항을 충족하지 못하면 패키지가 업데이트되고 패키지 잠금이 덮어씁니다.
- 패키지가 실패하도록 이우경패키지잠금덮는대설실신치하다록다사려니음용합을면도를 사용합니다.
npm ci
.
다음은 상황을 설명할 수 있는 시나리오입니다(NPM 6.3.0으로 확인).
패키지에서 종속성을 선언합니다.json like:
"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)
그런 다음 패키지를 수동으로 업데이트합니다.json to:
"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
npmci는 대규모 팀에 가장 큰 혜택을 약속합니다.개발자가 패키지 잠금에서 "사인오프"할 수 있는 기능을 제공하면 대규모 팀 간의 보다 효율적인 협업이 촉진되며, 잠금 파일에 있는 것을 정확히 설치할 수 있는 기능은 한 달에 수백 시간이 아니더라도 수십 시간을 절약할 수 있어 팀이 놀라운 것을 구축하고 배송하는 데 더 많은 시간을 할애할 수 있습니다.
소하는을 npm ci
안정적인 다빠르보인구축을위해적안정고▁for다
을 합니다.npm ci
를 입력합니다.npm install
.
"ci"는 "깨끗한 설치"를 나타냅니다.
관대한 패키지 대신 package-lock.json 파일을 기반으로 프로젝트 종속성을 설치합니다.json 파일 종속성.
팀 동료와 동일한 빌드를 생성하고 훨씬 더 빠릅니다.
당신은 이 블로그 게시물에서 그것에 대한 더 많은 것을 참조하십시오.
이 문제는 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
는 기존 프로젝트를 설치할 때 사용해야 하는 명령입니다.
▁use▁in습▁be를 사용할 수 있을 것입니다.--from-lock-file
(또는 유사한) 플래그는 에서만 설치합니다.package-lock.json
수정하지 않고.
이는 재현 가능한 빌드가 중요한 CI 등의 환경에 유용합니다.
기능 추적에 대한 내용은 https://github.com/npm/npm/issues/18286 을 참조하십시오.
아마도 당신은 이런 것을 사용해야 할 것입니다.
npm ci
사하는대를 사용하는 에.npm install
패키지 버전을 변경하지 않으려는 경우
공식 문서에 따르면 둘 다npm install
그리고.npm ci
프로젝트에 필요한 종속성을 설치합니다.
가장큰차점은이,은▁the점차rence▁is이큰.
npm install
?▁▁packages를 사용하는 합니까?packge.json
참고로의 경우에는npm ci
▁taking다▁▁the를 사용하는 패키지를 합니다.package-lock.json
정확한 패키지가 설치될 때마다 확인합니다.
아마 다음과 같은 것이 있을 것입니다.
"typescript":"~2.1.6"
의 신의에package.json
어떤 npm이 최신 마이너 버전으로 업데이트하는지, 당신의 경우는.2.4.1
편집: OP의 질문
하지만 "npm 설치"가 잠금 파일을 변경하는 이유는 설명되지 않습니다.잠금 파일은 재현 가능한 빌드를 만들기 위한 것이 아닙니까?그렇다면 semver 값에 관계없이 동일한 2.1.6 버전을 사용해야 합니다.
답변:
이것은 전체 종속성 트리를 잠그기 위한 것입니다.
typescript v2.4.1
을 요구합니다.widget ~v1.0.0
이 npm을 할 때 은 npm을 잡습니다.widget v1.0.0
개발자 빌드하고 "" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "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가 설치됩니다.
A@0.1.0 -- B@0.0.2 -- C@0.0.1 새 버전이 B의 종속성을 수정하지 않았다고 가정합니다.물론, B의 새로운 버전은 C의 새로운 버전과 많은 새로운 종속성을 포함할 수 있습니다.이러한 변경이 바람직하지 않은 경우 A의 작성자는 B@0.0.1에 대한 종속성을 지정할 수 있습니다.그러나 A의 저자와 B의 저자가 동일 인물이 아니라면, B가 전혀 변하지 않은 상황에서 A의 저자가 새로 출판된 C의 버전을 끌어들이고 싶지 않다고 말할 수 있는 방법은 없습니다.
OP 질문 2: 제가 제대로 이해했는지 보겠습니다.당신이 말하는 것은 잠금 파일이 2차 종속성의 버전을 지정하지만 여전히 패키지의 퍼지 매칭에 의존한다는 것입니다.json을 사용하여 최상위 종속성을 확인합니다.그게 정확합니까?
은 답변: No. package-lock에 하여 전체 트리를 .
package.json
.한다면typescript
에 잠겨 .2.4.1
의 신의에package-lock.json
변경될 때까지 그 상태를 유지해야 합니다. 내일이라고 .typescript
버전 리스2.4.2
만약 내가 당신의 지점을 확인하고 실행한다면,npm install
합니다.2.4.1
.
더 많은 정보package-lock.json
:
package-lock.json은 npm이 node_proxy 트리 또는 package.json을 수정하는 모든 작업에 대해 자동으로 생성됩니다.생성된 정확한 트리를 설명하므로 이후 설치 시 중간 종속성 업데이트에 관계없이 동일한 트리를 생성할 수 있습니다.
이 파일은 원본 리포지토리에 커밋되도록 작성되었으며 다양한 용도로 사용됩니다.
팀 동료, 배포 및 지속적인 통합을 통해 정확히 동일한 종속성을 설치할 수 있도록 종속성 트리를 단일하게 표현합니다.
디렉토리 자체를 커밋할 필요 없이 사용자가 node_modules의 이전 상태로 "시간 여행"할 수 있는 기능을 제공합니다.
읽을 수 있는 소스 제어 차이를 통해 트리 변경의 가시성을 높입니다.
또한 npm이 이전에 설치된 패키지에 대해 반복적인 메타데이터 확인을 건너뛸 수 있도록 하여 설치 프로세스를 최적화합니다.
https://docs.npmjs.com/files/package-lock.json
편집: "잠금"이라는 이름은 까다로운 이름입니다. NPM이 얀을 따라잡으려고 합니다.그것은 잠긴 파일이 아닙니다. package.json
사용자가 수정한 파일로, "설치"되면 node_dll 폴더 트리가 생성되고 해당 트리가 다음에 기록됩니다.package-lock.json
그입니다 - 은 보다시피, 그반니다에서 입니다. 종속성 버전은 에서 제거됩니다.package.json
언제나처럼, 그리고package-lock.json
라고 불러야 합니다.package-tree.json
(이렇게 많은 반대표를 던진 후에, 이것이 내 대답을 더 명확하게 만들었기를 바랍니다.)
대답: 간한답변단:package.json
에, 처럼의유지동는하안을존성평소동▁have안encies▁as▁your는▁depend유,▁while하.package-lock.json
는 "정확하고 더 중요하게 재현 가능한 node_dll 트리"(npm 문서 자체에서 추출)입니다.
까다로운 이름에 대해서는, 얀을 따라잡으려는 NPM입니다.
https://github.com/npm/npm/issues/18712 의 github 페이지에 이에 대한 미해결 문제가 있습니다.
이 문제는 개발자가 다른 운영 체제를 사용할 때 가장 심각합니다.
Npm 설치는 패키지에 대한 변경 사항을 검색합니다.종속성 목록을 적절히 반영하기 위해 json 파일.
예. 사용자가 새 종속성을 추가하거나 제거하면 빌드가 로컬 컴퓨터에서 종속성을 다운로드하거나 제거합니다.이것을 maven이 pom.xml 파일을 지속적으로 추적하여 종속성을 업데이트하는 java의 .m2 저장소와 비교할 수 있습니다.
package-lock.json은 패키지의 복제본입니다.json은 내부 프로세스에서 런타임에 사용되며 package-lock.json은 사용자에게 읽기 전용입니다.
언급URL : https://stackoverflow.com/questions/45022048/why-does-npm-install-rewrite-package-lock-json
'itsource' 카테고리의 다른 글
Node.js에 대한 Haskell의 응답은 무엇입니까? (0) | 2023.05.27 |
---|---|
fatal: not git 저장소(또는 상위 디렉터리): .git (0) | 2023.05.27 |
아이폰 5(와이드스크린 장치)를 감지하는 방법은 무엇입니까? (0) | 2023.05.27 |
MongoDB에서 다대다 관계를 구성하는 방법 (0) | 2023.05.27 |
VBA를 사용하여 폴더의 Excel 파일 목록 가져오기 (0) | 2023.05.27 |