Npm 거슬리는 pacakge-lock.json?
저는 Angular CLI를 이용해서 Angular 앱개발을 시작했습니다.
그러면 자연히 npm(Node Package Manager)을 사용한다는 말이 되죠.
얼마전 GitHub에 아래와 같은 경고 메시지가 등장합니다.
github 리파지토리 경고 메시지
package-lock.json이라는 녀석은 저의 작업 파일도 아닙니다.
대체 저 녀석은 무엇일까요?
오늘은 그것을 알아보도록 하겠습니다.
1. package-lock.json 이란?
npm 5.x.x 버젼 이상을 사용할 때 생겨나는 파일입니다.
이 파일이 생겨나는 시점은 npm install 입니다.
npm install 명령은 package.json을 보고 node_modules 폴더를 생성합니다.
그 폴더 안에 package.json에 명시된 의존성 패키지들을 설치하죠.
생성된 node_modules 폴더의 정보를 pacakge-lock.json에 담습니다.
동일한 package.json은 동일한 node_modules를 만들어내야합니다.
그래야 의존하는 앱이 정상적으로 동작을 할테니까요.
그러나 동일한 package.json이라도 서로 다른 node_modules를 만들게 되는 경우가 생깁니다.
1) npm의 버젼이 다른 경우
2) 의존성을 가진 패키지의 버젼이 업그레이드 되는 경우
3) 의존성을 가진 패키지가 의존하는 패키지의 버젼이 업그레이드 되는 경우
1) 은 쉽게 이해가 가는 내용이구요.
2), 3)의 경우, 아래와 같은 package.json을 예를 들어 보겠습니다.
{
"name": "myApp",
"version": "0.1.0",
"dependencies": {
"1st_depth": "^1.0.0"
}
}
myApp은 1st_depth라는 패키지에 의존성을 가지고 있습니다.
1st_depth 패키지는 아래와 같은 package.json을 가집니다.
{
"name": "1st_depth",
"version": "1.0.0",
"dependencies": {
"2nd_depth": "^1.0.0"
}
}
1st_depth은 2nd_depth라는 패키지에 의존성을 가지고 있구요.
2nd_depth의 package.json은 아래와 같습니다.
{
"name": "2nd_depth",
"version": "1.0.0"
}
위와 같은 설정에서 node_modules는 아래와 같은 구조가 되겠지요.
myApp@0.1.0
`-- 1st_depth@1.0.0
`-- 2nd_depth@1.0.0
이런 상황에서 위의 2), 3)번은 아래와 같이 발생하게 됩니다.
2) 의존성을 가진 패키지의 버젼이 업그레이드 되는 경우
myApp@0.1.0
`-- 1st_depth@1.0.1
`-- 2nd_depth@1.0.0
1st_depth가 1.0.1로 업데이트 되었다고 가정해봅시다.
그러면 npm install시 1.0.1 버젼의 1st_depth를 받아오게 됩니다.
사실 이는 myApp의 package.json에서 B 버젼을 완전히 고정하면 해결됩니다.
그러나 3)의 경우는 좀 더 복잡합니다.
3) 의존성을 가진 패키지가 의존하는 패키지의 버젼이 업그레이드 되는 경우
myApp@0.1.0
`-- 1st_depth@1.0.0
`-- 2nd_depth@1.0.1
2nd_depth가 1.0.1로 업데이트 되었다고 가정해봅시다.
그러면 npm install시 1.0.1버젼의 2nd_depth를 받아오게 됩니다.
1st_depth의 개발자는 보통 myApp 개발자와 다를 확률이 높습니다.
따라서 우리는 1st_depth 개발자의 package.json을 수정할 수 없습니다.
이런 상황이 package-lock.json의 필요성이 대두되는 순간입니다.
package locks 혹은 lockfiles로 불리우며 package.json의 약점을 보완합니다.
myApp 개발자의 node_modules 폴더의 스냅샷을 저장하는 방식으로 말이지요.
2. package-lock.json이 존재하는 경우 npm install
package-lock.json이 존재하는 경우 npm install의 동작이 조금 달라집니다.
npm install시 더이상 package.json을 계산하지 않습니다.
package-lock.json에 명시된 의존 패키지들을 통해 node_modules를 만들어내죠.
pacakge-lock.json이 생겨난 이유를 생각하면 당연합니다.
3. package-lock.json의 변경
따로 사용하는 방법이 있는 것은 아닙니다.
package.json 변경 후 npm 명령어를 수행하면 됩니다.
package.json의 변경은 package-lock.json보다 우선시됩니다.
npm install, npm rm, npm update는 개발자의 node_modules를 변경시키게 됩니다.
그러면 자연스럽게 package-lock.json이 변경됩니다.
Q & A
Q1. pacakge-lock.json은 형상관리에 포함시켜야하나?
당연히 포함시켜야합니다.
모든 개발자가 같은 node_modules를 가지고 작업하기 위해 필수입니다.
Q2. package-lcok.json이 충돌하게 되는 경우 어떻게 하나요?
여러 명의 개발자가 각각 다른 장비에서 npm install을 하다보면 발생하는 현상입니다.
5.7.0 버젼 이후로는 package.json을 수정하여 npm install을 하여 해결합니다.
--package-lock-only 라는 옵션을 통해 node_modules 수정 없이 해결도 가능합니다.
귀찮다면 npm-merge-driver라는 툴을 사용하면 됩니다.
Q3. package-lock.json이 자꾸 변경되는데 막을 수 있나요?
npm install 관련하여 --no-package-lock이라는 옵션을 사용할 수 있습니다.
npm install로 변경되는 node_modules의 변경사항을 저장하지 않는 방법이죠.
GitHub에서 package-lock.json에 대해 신경쓰이는 경고를 날려주는 바람에 공부했네요.
도움이 되실까하여 공유드립니다.
정보출처:
https://docs.npmjs.com/files/package-locks
https://medium.com/coinmonks/everything-you-wanted-to-know-about-package-lock-json-b81911aa8ab8
'IT Tech > Angular' 카테고리의 다른 글
Angular State Management (NGXS) Code (0) | 2018.09.22 |
---|---|
Angular State Management (NGXS) (0) | 2018.09.15 |
Angular 업데이트(Update from 5 to 6) (0) | 2018.05.19 |
Angular Service 만들기 (2) | 2018.05.13 |
Angular Domain Model (0) | 2018.04.24 |