npm 5가 오늘 릴리스되었으며 새로운 기능 중 하나에는 package-lock.json
파일 작성과 함께 결정적인 설치가 포함 됩니다.
이 파일은 소스 제어로 유지되어야합니까?
나는 그것이 비슷 있으리라 믿고있어 yarn.lock
및 composer.lock
소스 제어에 보관 해야하는 둘.
npm 5가 오늘 릴리스되었으며 새로운 기능 중 하나에는 package-lock.json
파일 작성과 함께 결정적인 설치가 포함 됩니다.
이 파일은 소스 제어로 유지되어야합니까?
나는 그것이 비슷 있으리라 믿고있어 yarn.lock
및 composer.lock
소스 제어에 보관 해야하는 둘.
답변:
예, package-lock.json
소스 제어에 체크인하기위한 것입니다. 당신이 NPM 5를 사용하는 경우, 명령 행에서이 나타날 수 있습니다 created a lockfile as package-lock.json. You should commit this file.
에 따르면 npm help package-lock.json
:
package-lock.json
npm이node_modules
트리 또는을 수정하는 모든 작업에 대해 자동으로 생성됩니다package.json
. 후속 설치가 중간 종속성 업데이트에 관계없이 동일한 트리를 생성 할 수 있도록 생성 된 정확한 트리를 설명합니다.이 파일은 소스 리포지토리에 커밋되어 다양한 용도로 사용됩니다.
팀원, 배포 및 지속적인 통합이 정확히 동일한 종속성을 설치하도록 종속성 트리의 단일 표현을 설명하십시오.
사용자가
node_modules
디렉토리 자체를 커밋하지 않고도 이전 상태로 "시간 여행"할 수있는 기능을 제공 합니다.읽을 수있는 소스 제어 차이를 통해 트리 변경의 가시성을 향상시킵니다.
또한 npm이 이전에 설치된 패키지에 대해 반복되는 메타 데이터 분석을 건너 뛰도록하여 설치 프로세스를 최적화하십시오.
주요 세부 사항 중 하나
package-lock.json
는 게시 할 수 없으며 최상위 패키지 이외의 위치에서 발견되면 무시됩니다. npm-shrinkwrap.json (5)과 형식을 공유합니다.이 형식은 본질적으로 동일한 파일이지만 게시는 허용합니다. CLI 도구를 배포하거나 제작 패키지 제작을 위해 게시 프로세스를 사용하지 않는 한 권장되지 않습니다.두 경우
package-lock.json
와는npm-shrinkwrap.json
패키지의 루트에 존재하는,package-lock.json
완전히 무시됩니다.
package-lock.json
나의 것에 추가 하는 것에 의지해야 했다 .gitignore
. 그것은 그것을 해결하는 것보다 훨씬 더 많은 문제를 야기하고 있었다. 병합 또는 리베이스 할 때 항상 충돌이 발생하고 병합 package-lock.json
으로 인해 CI 서버에서 손상이 발생하면이를 수정하는 데 어려움이 있습니다.
예, 체크인 예정입니다. 고유 한 커밋을 얻는 것이 좋습니다. 우리는 그것이 우리의 차이에 많은 소음을 추가한다는 것을 발견했습니다.
package-lock.json
트렁크 및 분기가있는 SCM 시스템에서 작업 할 때 파일 에 대한 조언이 있습니까? 트렁크에 병합 해야하는 지점에서 일부 변경 작업을 수행 중입니다. 이제 두 package-lock.json
파일 간의 충돌을 어떻게 해결해야 합니까? 고통 스럽습니다.
예, 당신은해야합니다 :
package-lock.json
.npm ci
npm install
CI와 로컬 개발 머신 모두에서 애플리케이션을 구축 할 때 대신npm ci
워크 플로우 요구 a의 존재를 package-lock.json
.
의 큰 단점 npm install
명령은이를 돌연변이 수의 예기치 않은 동작 인 package-lock.json
반면,npm ci
잠금 파일에 지정된 버전 만 사용하고 오류가 발생한다는 것입니다
package-lock.json
와 package.json
동기화되지package-lock.json
가 없습니다.따라서 npm install
로컬 에서 실행 됩니다 (예 : esp). 개발자가 여러 명인 대규모 팀의 경우 개발자 내에서 많은 충돌이 발생하여 package-lock.json
개발자가 package-lock.json
대신 완전히 삭제하기로 결정할 수 있습니다.
그러나 프로젝트의 종속성이 여러 시스템에서 안정적인 방식으로 반복적으로 해결된다고 믿을 수있는 강력한 사용 사례가 있습니다.
A로부터 package-lock.json
당신은 정확하게 얻을 : 알려진 - 투 - 작업 상태.
과거에는 package-lock.json
/ 없는 프로젝트가있었습니다npm-shrinkwrap.json
yarn.lock
에는 임의의 종속성으로 인해 업데이트가 중단되어 언젠가 빌드가 실패하는 / 파일이 .
때로는 마지막 작업 버전이 무엇인지 추측해야하기 때문에 이러한 문제를 해결하기가 어렵습니다.
새 종속성을 추가하려는 경우 여전히을 실행 npm install {dependency}
합니다. 업그레이드하려면 npm update {dependency}
또는 중 하나를 사용 npm install ${dependendency}@{version}
하고 변경된 것을 커밋하십시오.package-lock.json
.
업그레이드가 실패하면 마지막으로 알려진 작업으로 되돌릴 수 있습니다 package-lock.json
.
생성 된 패키지 잠금을 소스 제어에 커밋하는 것이 좋습니다. 이렇게하면 팀의 다른 사람, 배포, CI / 연속 통합 및 패키지 소스에서 npm 설치를 실행하는 모든 사람이 정확히 동일한 종속성 트리를 얻을 수 있습니다. 당신이 개발하고 있었다. 또한 이러한 변경 사항의 차이는 사람이 읽을 수 있으며 npm이 node_modules에 대한 변경 사항을 알려주므로 전 이적 종속성이 업데이트, 호이스트 등인지 확인할 수 있습니다.
그리고 vs 의 차이점npm ci
npm install
과 관련하여 :
- 프로젝트에는 기존 package-lock.json 또는 npm-shrinkwrap.json이 있어야합니다.
- 패키지 잠금의 종속성이 package.json의 종속성과 일치하지 않으면
npm ci
을 업데이트하는 대신 오류와 함께 종료됩니다.npm ci
한 번에 전체 프로젝트 만 설치할 수 있습니다.이 명령으로 개별 종속성을 추가 할 수 없습니다.- a
node_modules
가 이미 있으면npm ci
설치 를 시작 하기 전에 자동으로 제거 됩니다.package.json
패키지 잠금에 쓰지 않습니다 . 설치는 기본적으로 정지됩니다.
whose build would fail one day because a random dependency got a breaking update
문제가 해결됩니다. 같은 문제로 인해 자녀의 의존성이 생길 가능성이 있습니다.
예, 체크인하는 것이 가장 좋습니다 (예, 체크인)
나는 그것이 diff를 볼 때 많은 소음이나 충돌을 일으킬 것이라는 데 동의합니다. 그러나 이점은 다음과 같습니다.
^1.2.3
에서 사용할 수 package.json
있지만 npm install
개발자 시스템과 빌드 서버, 특히 간접 종속성 패키지에서 동일한 버전을 선택할 때마다 어떻게 할 수 있습니까? 글쎄, package-lock.json
그것을 보장합니다. (의 도움으로npm ci
잠금 파일을 기반으로 패키지를 설치 )npm audit fix
(감사 기능은 npm 버전 6에서 온 것 같습니다).npm ci
. 사람들은 종종 package-lock.json
패키지를 결정적으로 설치할 수 있다고 언급 하지만이 동작을 용이하게하는 명령은 거의 언급하지 않습니다! 많은 사람들이 아마도 npm install
잠금 파일에 정확히 무엇이 설치되어 있다고 잘못 가정했을 것입니다 .
내 프로젝트에서이 파일을 커밋하지 않습니다. 점은 무엇인가 ?
내가 나쁜 경험을했기 때문에 lib.에 대해 package.json에서 ^를 사용하지 않는 것이 사실이지만.
package-lock.json
. 일부 repos는이를 통해 얻을 수있는 이점을 요구하지 않을 수 있으며 소스에 자동 생성 된 컨텐츠가없는 것을 선호 할 수 있습니다.
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 줄이 더 이상 변경되지 않았습니다!)
gd() { git diff --color-words $1 $2 -- :!/yarn.lock :!/package-lock.json; }
내 .bashrc에 대신 별칭에.
예,이 파일을 커밋 할 수 있습니다. 로부터 NPM의 공식 문서 :
package-lock.json
트리npm
또는를 수정 하는 모든 작업에 대해 자동으로 생성됩니다 . 후속 설치가 중간 종속성 업데이트에 관계없이 동일한 트리를 생성 할 수 있도록 생성 된 정확한 트리를 설명합니다.node_modules
package.json
이 파일은 소스 리포지토리에 커밋하기위한 것입니다.
npm ci
package-lock.json에서 설치를 실행할 수 있습니다.
package-lock.json을 전체적으로 비활성화
터미널에 다음을 입력하십시오.
npm config set package-lock false
이것은 정말 마술처럼 나를 위해 작동
~/.npmrc
콘텐츠로 (적어도 내 macos에서) 생성 package-lock=false
하며 동일한 특정 프로젝트와 함께 수행 할 수 있습니다 node_modules/
(예 :echo 'package-lock=false' >> .npmrc
예, package-lock.json을 커밋하는 것이 표준 관행입니다.
package-lock.json을 커밋하는 주된 이유는 프로젝트의 모든 사람이 동일한 패키지 버전에 있기 때문입니다.
장점 :-
단점 :-
편집 : npm 설치는 프로젝트의 모든 사람이 동일한 패키지 버전인지 확인하지 않습니다. npm ci가 도움이 될 것입니다.
npm ci
대신에 사용하면 단점이 사라집니다 npm install
.
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 ...
git log
다루기 가 더 쉬워집니다.