(8) JavaScript Module - package-lock.json

반응형

date-fns 설치후 생성되는 파일중 package-lock.json 파일이 있는데

열어보면 packages 필드가 존재한다.

{
  "name": "04.npm",
  "lockfileVersion": 3,
  "requires": true,
  "packages": {
    "": {
      "dependencies": {
        "date-fns": "^4.1.0"
      }
    },
    "node_modules/date-fns": {
      "version": "4.1.0",
      "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz",
      "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==",
      "license": "MIT",
      "funding": {
        "type": "github",
        "url": "https://github.com/sponsors/kossnocorp"
      }
    }
  }
}

해당 필드에도 패키지에 대한 정보가 많이 있으며

 "node_modules/date-fns": {
      "version": "4.1.0",
      "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz",
      "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==",
      "license": "MIT",
      "funding": {
        "type": "github",
        "url": "https://github.com/sponsors/kossnocorp"
      }

node_modules에 있는 패키지 이름과 버전 정보가 있다.

 

이 버전들은 현재 node_modules에 설치된 버전이며

package.json 파일에는 설치한 패키지와 버전 범위만 기록되어 있지만

package-lock.json 파일에는 node_modules에 있는 모든 패키지

설치한 패키지dependency로 설치된 패키지들과 

각 패키지의 버전이 정확히 기록되어 있는 것이다.

 

버전이 기록되어 있다는 것은 알겠는데 이 파일은 도대체 왜 필요한 것일까?

 

먼저 패키지를 공유하는 과정에 대해 자세히 살펴보자


package-lock.json의 필요성

Node.js 환경에서 협업을 할 때는 보통 만들고 있는 패키지를 공유한다.

패키지 폴더를 바로 공유 대상에게 보내거나 압축을 해서 보내거나 

아니면 Git 같은 협업 툴을 사용할 수 있는데

이때 패키지의 node_modules 디렉토리는 용량이 크기 때문에 공유하지 않는다.

대신 package.json 파일을 공유하면 

공유 받은 사람은 dependencies 필드를 이용해서

버전을 체크한 후 필요한 패키지들을 설치할 수 있다.

 

예를 들어 협업 하는 사람한테 소스 코드와 package.json 파일을 공유 받았다고 치자면

(당연히 node_modules와 lock.json은 공유 받지 않는다고 가정)

 

터미널을 실행하고 package.json이 있는 폴더 위치에서

npm install을 하면 필요한 패키지들이 설치된다.

다시 node_module와 lock.json이 설치된다.

이렇게 Node.js 코드를 공유할 때는 필요한 패키지들을 설치하면 된다.

 

하지만 문제는 dependencies 필드에는 정확한 버전을 써 줄 때도 있지만

버전의 범위를 주로 쓰기 때문에 어떤 버전이 설치될지 확신할 수 없다.

왜냐하면 내가 이 코드를 받을 때 새로운 메이저 버전이 나온상태라고 치면

이전 버전을 공유 받은 상태라면 어떤 버그가 생길지 알 수 없기 때문이기에

코드를 공유한 사람과 공유 받은 사람이 사용하는 패키지 버전이 다를 수 있다는 것이다.

 

협업을 할 때는 협업하는 사람들끼리 완전히 똑같은 환경을 구성해야 한다.

이때 필요한 것이 바로 package-lock.json 파일이다.

 

package-lock.json 파일에는 설치된 모든 패키지의 정확한 버전 정보가 기록되어 있기 때문에

lock.json까지 있는 상태에서 npm install을 하면 정확히 똑같은 버전의 패키지들이 설치된다.

그래서 최초 공유할 때 package-lock.json도 같이 공유 받아야하며

이 상태에서 다시 npm install을 해야 공유한 사람과 공유 받은 사람의 패키지 버전이 같아진다.

 

정리하자면 코드를 서드파티 모듈은 공유가 되는 것이아니라 

프로그램 코드 파일, package.json, package-lock.json 파일. 총 3 가지가 공유되어야 하며

협업할 때 꼭 서로 똑같은 환경을 구성하도록 하자.

반응형