npm 5에서 만든 package-lock.json 파일을 커밋합니까?


1393

npm 5가 오늘 릴리스되었으며 새로운 기능 중 하나에는 package-lock.json파일 작성과 함께 결정적인 설치가 포함 됩니다.

이 파일은 소스 제어로 유지되어야합니까?

나는 그것이 비슷 있으리라 믿고있어 yarn.lockcomposer.lock소스 제어에 보관 해야하는 둘.


20
짧은 대답 : 예. 한 의견 : package-lock.json이 변경되면 다른 소스 변경과 별도로 해당 변경 사항을 커밋 할 수 있습니다. 이것은 git log다루기 가 더 쉬워집니다.
Purplejacket

14
파일이없는 경우 결정적인 설치를 생성하는 데 도움이되지 않습니다.
Alan H.

4
프로젝트에 따라 다릅니다. github.com/npm/npm/issues/20603
Gajus

3
당신이 정말로 npm을 신뢰한다면, 목적은 프로젝트가 무엇을 사용하고 있는지보다 명확하게보고하는 것입니다. 실제로 예측 가능성을 원한다면이 파일을 무시하고 대신 node_modules (응답 + 주석의 .npmrc 및 관련 구성 참조)를 설치하고 패키지 관리자가 수행하는 작업이 아니라 실제로 변경되는 사항을 추적하십시오. 궁극적으로 어느 것이 더 중요합니까? 패키지 관리자 또는 사용중인 코드
jimmont

답변:


1614

예, package-lock.json소스 제어에 체크인하기위한 것입니다. 당신이 NPM 5를 사용하는 경우, 명령 행에서이 나타날 수 있습니다 created a lockfile as package-lock.json. You should commit this file.에 따르면 npm help package-lock.json:

package-lock.jsonnpm이 node_modules트리 또는을 수정하는 모든 작업에 대해 자동으로 생성됩니다 package.json. 후속 설치가 중간 종속성 업데이트에 관계없이 동일한 트리를 생성 할 수 있도록 생성 된 정확한 트리를 설명합니다.

이 파일은 소스 리포지토리에 커밋되어 다양한 용도로 사용됩니다.

  • 팀원, 배포 및 지속적인 통합이 정확히 동일한 종속성을 설치하도록 종속성 트리의 단일 표현을 설명하십시오.

  • 사용자가 node_modules디렉토리 자체를 커밋하지 않고도 이전 상태로 "시간 여행"할 수있는 기능을 제공 합니다.

  • 읽을 수있는 소스 제어 차이를 통해 트리 변경의 가시성을 향상시킵니다.

  • 또한 npm이 이전에 설치된 패키지에 대해 반복되는 메타 데이터 분석을 건너 뛰도록하여 설치 프로세스를 최적화하십시오.

주요 세부 사항 중 하나 package-lock.json는 게시 할 수 없으며 최상위 패키지 이외의 위치에서 발견되면 무시됩니다. npm-shrinkwrap.json (5)과 형식을 공유합니다.이 형식은 본질적으로 동일한 파일이지만 게시는 허용합니다. CLI 도구를 배포하거나 제작 패키지 제작을 위해 게시 프로세스를 사용하지 않는 한 권장되지 않습니다.

두 경우 package-lock.json와는 npm-shrinkwrap.json패키지의 루트에 존재하는, package-lock.json완전히 무시됩니다.


77
파일을 커밋하는 것이 실제로 어떤 종류의 프로젝트에서 도움이됩니까? semver와 package.json의 요점은 업데이트 된 호환 가능한 의존성을 언급 할 필요가 없다는 것입니다.
curiousdannii

45
핵심 단어는 "필요하지 않아야합니다"입니다. 그러나 실제로 사람들은 semver를 완벽하게 따르지 않습니다. 그렇기 때문에 package-lock.json과 package.json을 함께 사용하여 패키지를 쉽게 업데이트 할 수 있지만 모든 개발자와 배포 된 모든 응용 프로그램이 동일한 종속성 트리를 사용하고 있는지 확인할 수 있습니다.
Panu Horsmalahti

34
@trusktr : Sindre Sorhus "앱에는 잠금 파일을 사용 하지만 패키지에는 사용하지 않는 것이 좋습니다 ."
vine77

23
또 다른 것은 package-lock.json이 NPM에 게시 할 때 무시되므로 개발자가 라이브러리 개발에이를 사용하는 경우 업데이트 된 종속성 버전에서 회귀를 잡을 가능성을 최소화하는 것입니다. 최종 사용자에 대한 버그. 이러한 이유로 라이브러리 개발에 잠금 파일을 사용하지 않으면 버그를 줄일 가능성이 높아집니다.
trusktr

128
개인적으로 나는 지금 package-lock.json나의 것에 추가 하는 것에 의지해야 했다 .gitignore. 그것은 그것을 해결하는 것보다 훨씬 더 많은 문제를 야기하고 있었다. 병합 또는 리베이스 할 때 항상 충돌이 발생하고 병합 package-lock.json으로 인해 CI 서버에서 손상이 발생하면이를 수정하는 데 어려움이 있습니다.
Stefan Z Camilleri

111

예, 체크인 예정입니다. 고유 한 커밋을 얻는 것이 좋습니다. 우리는 그것이 우리의 차이에 많은 소음을 추가한다는 것을 발견했습니다.


19
소스 코드 저장소에 체크인해야하는지 토론하는 것이 공정하지만 npm에이 파일을 게시하는 것은 실제로 논쟁의 여지가 없습니다. package-lock.json 또는 shrinkwrap 파일을 npm 레지스트리에 포함시켜야합니다. 그렇지 않으면 게시 된 패키지에 1 세대 종속성의 종속성이 고정되지 않은 변경 사항이 적용됩니다. 2 세대 이상의 종속성 중 하나가 주요 변경 사항을 게시하고 게시 된 패키지가 신비하게 깨지기 전까지는 이것이 문제가되지 않습니다. 이 package-lock.json 파일은 해당 문제를 해결하기 위해 만들어졌습니다.
guerillapresident

8
@BetoAveiga 노이즈로 나는 package-lock.json을 사용한 커밋이 너무 많은 노드 패키지 버전을 가질 수 있으며 커밋의 다른 작업은 숨겨집니다.
xer0x

7
나는 일반적으로 패키지 설치를 다른 작업과 분리하여 유지합니다. "Installed chai and mocha"와 같은 커밋을 비교할 필요가 없습니다. 이미 변경된 사항을 알고 있기 때문입니다.
Keith

3
package-lock.json트렁크 및 분기가있는 SCM 시스템에서 작업 할 때 파일 에 대한 조언이 있습니까? 트렁크에 병합 해야하는 지점에서 일부 변경 작업을 수행 중입니다. 이제 두 package-lock.json파일 간의 충돌을 어떻게 해결해야 합니까? 고통 스럽습니다.
kmiklas

3
@guerillapresident 알다시피, 당신은 부분적으로 정확합니다. 이 파일을 npm에 게시하는 것은 논쟁의 여지가 없습니다. 게시 할 수 없습니다.
Tim Gautier

66

예, 당신은해야합니다 :

  1. 커밋 package-lock.json .
  2. 사용하다 npm cinpm installCI와 로컬 개발 머신 모두에서 애플리케이션을 구축 할 때 대신

npm ci워크 플로우 요구 a의 존재를 package-lock.json.


의 큰 단점 npm install명령은이를 돌연변이 수의 예기치 않은 동작 인 package-lock.json반면,npm ci 잠금 파일에 지정된 버전 만 사용하고 오류가 발생한다는 것입니다

  • 만약에 package-lock.jsonpackage.json동기화되지
  • 경우 package-lock.json가 없습니다.

따라서 npm install로컬 에서 실행 됩니다 (예 : esp). 개발자가 여러 명인 대규모 팀의 경우 개발자 내에서 많은 충돌이 발생하여 package-lock.json개발자가 package-lock.json대신 완전히 삭제하기로 결정할 수 있습니다.

그러나 프로젝트의 종속성이 여러 시스템에서 안정적인 방식으로 반복적으로 해결된다고 믿을 수있는 강력한 사용 사례가 있습니다.

A로부터 package-lock.json당신은 정확하게 얻을 : 알려진 - 투 - 작업 상태.

과거에는 package-lock.json/ 없는 프로젝트가있었습니다npm-shrinkwrap.jsonyarn.lock 에는 임의의 종속성으로 인해 업데이트가 중단되어 언젠가 빌드가 실패하는 / 파일이 .

때로는 마지막 작업 버전이 무엇인지 추측해야하기 때문에 이러한 문제를 해결하기가 어렵습니다.

새 종속성을 추가하려는 경우 여전히을 실행 npm install {dependency}합니다. 업그레이드하려면 npm update {dependency}또는 중 하나를 사용 npm install ${dependendency}@{version}하고 변경된 것을 커밋하십시오.package-lock.json .

업그레이드가 실패하면 마지막으로 알려진 작업으로 되돌릴 수 있습니다 package-lock.json.


npm doc인용 하려면 :

생성 된 패키지 잠금을 소스 제어에 커밋하는 것이 좋습니다. 이렇게하면 팀의 다른 사람, 배포, CI / 연속 통합 및 패키지 소스에서 npm 설치를 실행하는 모든 사람이 정확히 동일한 종속성 트리를 얻을 수 있습니다. 당신이 개발하고 있었다. 또한 이러한 변경 사항의 차이는 사람이 읽을 수 있으며 npm이 node_modules에 대한 변경 사항을 알려주므로 전 이적 종속성이 업데이트, 호이스트 등인지 확인할 수 있습니다.

그리고 vs차이점npm cinpm install 과 관련하여 :

  • 프로젝트에는 기존 package-lock.json 또는 npm-shrinkwrap.json이 있어야합니다.
  • 패키지 잠금의 종속성이 package.json의 종속성과 일치하지 않으면 npm ci 을 업데이트하는 대신 오류와 함께 종료됩니다.
  • npm ci 한 번에 전체 프로젝트 만 설치할 수 있습니다.이 명령으로 개별 종속성을 추가 할 수 없습니다.
  • a node_modules가 이미 있으면 npm ci설치 를 시작 하기 전에 자동으로 제거 됩니다.
  • package.json패키지 잠금에 쓰지 않습니다 . 설치는 기본적으로 정지됩니다.

참고 : 비슷한 답변을 여기에 게시했습니다 .


10
이 답변은 특히 npm ci를 사용하여 더 많은 크레딧을 얻을 가치가 있습니다. 이를 사용하면 사람들이 패키지 잠금에서 겪은 대부분의 문제를 완화 할 수 있습니다.
JamesB 2016 년

package.json (캐럿 또는 물결표 없음)에서 고정 버전을 사용하는 것이 훨씬 더 깨끗한 옵션이라는 것을 알았습니다. 이렇게하면 whose build would fail one day because a random dependency got a breaking update문제가 해결됩니다. 같은 문제로 인해 자녀의 의존성이 생길 가능성이 있습니다.
Ashwani Agarwal

58

예, 체크인하는 것이 가장 좋습니다 (예, 체크인)

나는 그것이 diff를 볼 때 많은 소음이나 충돌을 일으킬 것이라는 데 동의합니다. 그러나 이점은 다음과 같습니다.

  1. 모든 패키지의 동일한 버전을 보장합니다 . 이 부분은 다른 시간에 다른 환경에서 구축 할 때 가장 중요합니다. ^1.2.3에서 사용할 수 package.json있지만 npm install개발자 시스템과 빌드 서버, 특히 간접 종속성 패키지에서 동일한 버전을 선택할 때마다 어떻게 할 수 있습니까? 글쎄, package-lock.json그것을 보장합니다. (의 도움으로npm ci 잠금 파일을 기반으로 패키지를 설치 )
  2. 설치 프로세스가 향상됩니다.
  3. 그것은 새로운 감사 기능에 도움이됩니다 npm audit fix(감사 기능은 npm 버전 6에서 온 것 같습니다).

3
내가 아는 한, semver (npm devs는 어쨌든 이해하지 못함)를 사용하지 않으면 최소한 99 %의 경우 lockfile을 갖는 것과 동일한 동작을 가져와야합니다. 내 자신의 경험은 semver fuckups는 주로 기본 패키지 (직접 종속성, crappy jquery datepickers 등)로 발생한다는 것입니다. npm에 대한 나의 개인적인 경험은 잠금 파일이 영원히 소음이라는 것입니다. 이 지혜가 최신 버전과 달라지지 않기를 바랍니다.
Svend

13
언급 +1 npm ci. 사람들은 종종 package-lock.json패키지를 결정적으로 설치할 수 있다고 언급 하지만이 동작을 용이하게하는 명령은 거의 언급하지 않습니다! 많은 사람들이 아마도 npm install잠금 파일에 정확히 무엇이 설치되어 있다고 잘못 가정했을 것입니다 .
ahaurat

npm ci는 npm 5에 없습니다.
dpurrington

감사합니다! 를 사용하는 경우 package-lock.json을 커밋하는 것이 좋습니다 npm ci. 팀 / 리드 개발자가 업데이트시기를 결정할 수 있습니다. 모든 사람이 임의로 커밋하는 경우 아무런 의미가 없으며 리포지토리에 소음이 발생합니다. NPM 문서 는이를보다 명확하게해야합니다. 대부분의 개발자는이 기능으로 인해 혼란스러워합니다.
adampasz

@adampasz 실제로 각 개발자는 잠금 파일을 커밋 할 수 있으며 테스트를 통과하고 병합 한 후 두 번째 분기는 패키지가 변경되면 잠금 파일을 갱신합니다 (패키지를 변경하지 않습니다 .json, 종종이 문제에 직면하지 않습니다 (
Xin

38

내 프로젝트에서이 파일을 커밋하지 않습니다. 점은 무엇인가 ?

  1. 생성됩니다
  2. gitlab-ci.yml 빌드를 사용하는 gitlab의 SHA1 코드 무결성 오류의 원인입니다.

내가 나쁜 경험을했기 때문에 lib.에 대해 package.json에서 ^를 사용하지 않는 것이 사실이지만.


11
나는 이것이 npm docs 내에서 더 많이 설명되기를 바란다.-커밋하지 않으면 구체적으로 잃어버린 것에 대한 개요를 갖는 것이 유용 할 것이다 package-lock.json. 일부 repos는이를 통해 얻을 수있는 이점을 요구하지 않을 수 있으며 소스에 자동 생성 된 컨텐츠가없는 것을 선호 할 수 있습니다.
PotatoFarmer

2
문제를 해결하는 데 도움이되는 디버깅 (예 : 두 잠금 사이의 차이점)에 유용한 방법을 알 수 있습니다. 나는 그것이 이런 종류의 것들을 막기 위해 사용될 수 있다고 생각하지만 공유 리포지토리에서 병합 충돌을 경험할 수있는 고통이있을 수 있습니다. 우선 간단한 것을 유지하기 위해 package-lock.json이 실제로 필요할 때까지 package.json을 단독으로 사용합니다.
radtek

6
package.json에서 ^를 사용할 수는 없지만 종속성이 사용하지 않을 수 있습니까?
neiker

35

git diff를 할 때 소음에 대해 불평하는 사람들에게 :

git diff -- . ':(exclude)*package-lock.json' -- . ':(exclude)*yarn.lock'

내가 한 것은 별칭을 사용하는 것입니다.

alias gd="git diff --ignore-all-space --ignore-space-at-eol --ignore-space-change --ignore-blank-lines -- . ':(exclude)*package-lock.json' -- . ':(exclude)*yarn.lock'"

전체 저장소에 대해 diffs에서 package-lock.json을 무시하려면 (이를 사용하는 모든 사람) 다음에 추가하십시오 .gitattributes.

package-lock.json binary
yarn.lock binary

"이진 파일 a / package-lock.json과 b / package-lock.json은 패키지 잠금 파일이 변경 될 때마다 다릅니다." 이 작업을 수행 할 때 온라인으로 볼 때 diff에서 이러한 파일 (10k 줄이 더 이상 변경되지 않았습니다!)


1
내가 가진 gd() { git diff --color-words $1 $2 -- :!/yarn.lock :!/package-lock.json; }내 .bashrc에 대신 별칭에.
apostl3pol

16

예,이 파일을 커밋 할 수 있습니다. 로부터 NPM의 공식 문서 :

package-lock.json트리 npm또는를 수정 하는 모든 작업에 대해 자동으로 생성됩니다 . 후속 설치가 중간 종속성 업데이트에 관계없이 동일한 트리를 생성 할 수 있도록 생성 된 정확한 트리를 설명합니다.node_modulespackage.json

이 파일은 소스 리포지토리에 커밋하기위한 것입니다.


13
설치가 항상 node_modules를 업데이트하지 않으므로 package-lock.json을 업데이트하지 않습니까?
Tim Gautier

2
아니요, npm cipackage-lock.json에서 설치를 실행할 수 있습니다.
윌리엄 햄프셔에게

repo에 package-lock.json이있는 경우 지속적인 통합 빌드에서 반드시 npm ci를 사용해야한다는 답을 강조해야합니다.
MagicLAMP

6

package-lock.json을 전체적으로 비활성화

터미널에 다음을 입력하십시오.

npm config set package-lock false

이것은 정말 마술처럼 나를 위해 작동


2
이것은 ~/.npmrc콘텐츠로 (적어도 내 macos에서) 생성 package-lock=false하며 동일한 특정 프로젝트와 함께 수행 할 수 있습니다 node_modules/(예 :echo 'package-lock=false' >> .npmrc
jimmont

6
이것이 부정적 일 것이라는 점이 저에게 재밌습니다. npm 커뮤니티는 package-lock.json 자동 생성이 나쁜 커뮤니티 참여라는 것을 받아 들일 수 없습니다. 팀 프로세스에 영향을 줄 수있는 일을해서는 안됩니다. 강제하지 않고 활성화 할 수있는 옵션이어야합니다. 얼마나 많은 사람들이 "git add *"를하고 그것을 알아 차리고 빌드를 망쳐 놓지 않습니까 병합 기반 흐름의 종류가 있다면 git flow가 그것을 사용하는 사람들에게 성경과 같다는 것을 알고 있습니다. 당신은 병합에 세대를 가질 수 없습니다! npm 버전 관리가 중단되었습니다. 패키지 : 1.0.0이 결정적이어야합니다!
Eric Twilegar 22

3
이게 왜 투표권이 없습니까? 이것은 작동하지 않는 기능을 비활성화하는 합법적 인 방법입니다. 그리고 그 자체로 질문에 대답하지는 않지만 질문을 약화시킵니다. 즉, 더 이상 대답 할 필요가 없습니다. 내 엄지 손가락 :)
Superole

다운 보트가 발생하는 이유는 단순히 기능을 비활성화했기 때문입니다.
Raza

5

예, package-lock.json을 커밋하는 것이 표준 관행입니다.

package-lock.json을 커밋하는 주된 이유는 프로젝트의 모든 사람이 동일한 패키지 버전에 있기 때문입니다.

장점 :-

  • 엄격한 버전 관리를 따르고 주요 버전으로 자동 업데이트를 허용하지 않으면 패키지 잠금을 커밋하는 타사 패키지의 이전 버전과 호환되지 않는 변경 사항을 피할 수 있습니다.
  • 특정 패키지를 업데이트하면 package-lock.json에서 패키지가 업데이트되고 리포지토리를 사용하는 모든 사용자가 변경 내용을 가져 오면 해당 특정 버전으로 업데이트됩니다.

단점 :-

  • 풀 요청이보기 흉하게 보일 수 있습니다 :) '

편집 : npm 설치는 프로젝트의 모든 사람이 동일한 패키지 버전인지 확인하지 않습니다. npm ci가 도움이 될 것입니다.


4
npm ci대신에 사용하면 단점이 사라집니다 npm install.
k0pernikus

2
스코프는 약간 오싹 하지만 여기 @ k0pernikus의 훌륭한 조언에 대한 자세한 정보가 있습니다.
ruffin

1
"프로젝트의 모든 사용자가 동일한 패키지 버전을 사용하므로 npm 설치
만하면

감사합니다, @reggaeguitar. 이것에 대한 내 대답을 업데이트합니다.
Nikhil Mohadikar

2

npm을 사용하면 축소 / 축소 CSS / JS를 생성하고 django 응용 프로그램에서 제공하는 페이지에 필요한 자바 스크립트를 생성하는 것입니다. 내 응용 프로그램에서 Javascript는 페이지에서 실행되어 애니메이션을 만들고 때로는 ajax 호출을 수행하고 VUE 프레임 워크 내에서 작업하거나 CSS로 작업합니다. package-lock.json이 package.json에있는 항목을 일부 제어 할 수있는 경우이 파일의 버전이 하나 필요할 수 있습니다. 내 경험상 그것은 npm install로 설치되는 것에 영향을 미치지 않거나, 그렇지 않은 경우 내 지식에 배포하는 응용 프로그램에 악영향을 미치지 않았습니다. 나는 mongodb 또는 전통적으로 씬 클라이언트 인 다른 응용 프로그램을 사용하지 않습니다.

npm install이이 파일을 생성하고 npm install은 앱을 실행하는 각 서버에서 배포 프로세스의 일부이므로 repo에서 package-lock.json을 제거합니다. 노드와 npm의 버전 제어는 각 서버에서 수동으로 수행되지만 동일하게주의해야합니다.

언제 npm install서버에서 실행될 package-lock.json을 변경하고 서버의 저장소에 의해 기록 된 파일에 변경 사항이있는 경우 다음 배치 WONT를 사용하면 새 변경 사항을 원본에서 가져올 수 있습니다. 풀은 package-lock.json에 대한 변경 사항을 덮어 쓰기 때문에 배포 할 수 없습니다.

package-lock.json이 내용을 반영하지 않으면 npm은 명령을 실행할 때마다 불평하므로 repo에있는 내용으로 로컬로 생성 된 package-lock.json을 덮어 쓸 수도 없습니다 (하드 원점 재설정). npm 설치로 인한 node_modules로 인해 배포가 중단됩니다. 이제 node_modules에 약간 다른 버전이 설치되었다고 표시되면 다시 한 번 문제가 발생하지 않았습니다.

node_modules가 리포지토리에 있지 않은 경우 (그렇지 않아야 함) package-lock.json을 무시해야합니다.

누락 된 부분이 있으면 주석에서 수정하십시오. 그러나이 파일에서 버전 관리가 취해진 점은 의미가 없습니다. package.json 파일에는 버전 번호가 있으며이 파일은 npm 설치가 발생할 때 패키지를 빌드하는 데 사용되는 것으로 가정합니다. 제거 할 때 npm 설치는 다음과 같이 불평합니다.

jason@localhost:introcart_wagtail$ rm package.json
jason@localhost:introcart_wagtail$ npm install
npm WARN saveError ENOENT: no such file or directory, open '/home/jason/webapps/introcart_devtools/introcart_wagtail/package.json'

node_modules를 설치하거나 npm을 적용하여 js / css를 빌드 할 때 빌드가 실패하지만 package-lock.json을 제거해도 불만이 없습니다.

jason@localhost:introcart_wagtail$ rm package-lock.json 
jason@localhost:introcart_wagtail$ npm run dev

> introcart@1.0.0 dev /home/jason/webapps/introcart_devtools/introcart_wagtail
> NODE_ENV=development webpack --progress --colors --watch --mode=development

 10% building 0/1 modules 1 active ...

추가하기 위해 이제 package-lock.json을 저장소에 커밋하고 삭제 가능한 node_modules라고 생각하는 배포 가능한 npm ci를 사용하고 있으며 모든 것을 업데이트하지 않고 package-lock.json에 설치합니다. 이를 통해 프런트 엔드 담당자가 배포시 수동 개입없이 자바 스크립트를 업그레이드 할 수 있습니다.
MagicLAMP
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.