Npm 거슬리는 pacakge-lock.json?

2018. 9. 2. 15:18

저는 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
Npm 거슬리는 pacakge-lock.json?  (0) 2018.09.02
Angular 업데이트(Update from 5 to 6)  (0) 2018.05.19
Angular Service 만들기  (2) 2018.05.13
Angular Domain Model  (0) 2018.04.24

TechTrip IT Tech/Angular , , , ,