package.json과 package-lock.json

package.json

package.json은 프로젝트의 정보를 정의하고, 의존하는 패키지 버전 정보를 명시하는 파일이다.
일반적으로 루트 디렉토리에 위치하며, 작성되는 정보를 크게 프로젝트의 정보, 패키지 버전 정보로 나눌 수 있다.

{
  "name" : "test", // 프로젝트의 이름
  "description" : "javascript's test programming.", // 프로젝트 설명
  "keywords" : ["util", "f", "server", "client", "browser"], // 프로젝트 검색할 때 참조되는 키워드
  "author" : "Goorm", // 프로젝트 작성자
  "contributors" : [], // 프로젝트에 참여한 공헌자
  "dependencies" : [], // 프로젝트 의존성 관리. 요구되는 확장 모듈 정리
  "repository" : {"type": "git", "url" : "git://gitbub.com/documentcloud/test.git" }, // 프로젝트 소스 코드 저장소
  "main" : "test.js",
  "version" : "1.1.6" // 프로젝트 버전
}
  • 프로젝트의 정보: name, version 영역
  • 패키지 버전 정보: dependencies 또는 devDependencies 영역

프로젝트 정보

package.json 파일은 반드시 name과 version 항목을 포함해야 한다.

  • name: 소문자 한 단어로 이루어져야 한다. 하이픈(-)과 언더스코어(_)가 포함될 수 있다.
  • version: x.x.x 형식을 따라야 한다.

패키지 정보

패키지 정보는 dependencies 또는 devDependencies에 작성된다.

  • dependencies: 프로덕션 환경에서 응용 프로그램에 필요한 패키지
  • devDependencies: 로컬 개발 및 테스트에만 필요한 패키지

패키지를 지정하기 위해서는 dependencies 또는 devDependencies에 패키지를 명시해야 한다.

시맨틱 버저닝

버전을 명시할 때 작성 규칙을 시맨틱 버저닝이라고 한다.
dot(.) 기준으로 major.minor.patch로 구분된다.

  • 최초 출시: 1.0.0으로 시작한다.
  • patch: 이전 버전과 호환되는 버그 수정. 세 번째 숫자를 증가시킨다. ex) 1.0.1
  • minor: 이전 버전과 호환되는 새로운 기능. 가운데 숫자를 증가시키고 마지막 숫자를 0으로 만든다. ex) 1.1.0
  • major: 이전 버전과 호환되지 않는 변경. 첫 번째 숫자를 증가시키고 가운데와 마지막 숫자를 0으로 만든다. ex) 2.0.0

틸드와 캐럿

패키지의 버전에는 틸드(~)와 캐럿(^) 표기되어 있다.

  • 틸드(~): 해당 패키지의 패치 레벨 변경을 허용하겠다는 의미.
    ex) "~4.3.0" 이면 4.3.0 이상, 4.4.0 미만과 같은 의미로, 4.4.0 미만의 패치 레벨 변경을 허용한다는 의미이다.
  • 캐럿(^): 해당 패키지의 마이너, 패치 변경을 허용하겠다는 의미.
    ex) "^2.6.11"은 2.6.11 이상, 3.0.0 미만과 같은 의미로, 3.0.0 미만의 마이너, 패치 변경을 허용하겠다는 의미이다.

package-lock.json

틸드와 캐럿처럼 package.json에서는 버전정보를 저장할 때 version range를 사용한다.
협업을 할 때는 package.json을 사용해 각자의 컴퓨터에 같은 패키지들을 설치해서 개발 환경을 구성한다. 이 때, 아래와 같은 경우에는 같은 package.json을 이용해 npm install을 진행하더라도 서로 다른 node_modules를 생성하는 경우가 발생하기도 한다.

  • npm 버전이 다른 경우
  • version range 때문에 최신 버전의 패키지가 설치된 경우
  • 사용하고 있는 패키지가 의존하고 있는 패키지가 새로운 버전으로 배포된 경우

이런 상황을 피하기 위해 생긴 것이 package-lock.json이다.
package-lock.json에는 정확한 버전명이 적혀있다.

npm install을 할 때 같이 생기는데, node_modules 구조나 package.json이 수정되고 생성될 때 당시 의존성에 대한 정확하고 구체적인 정보를 명시해준다.

따라서 협업할 때는 package-lock.json을 꼭 레파지토리에 같이 커밋해주자.


출처
https://junwoo45.github.io/2019-10-02-package-lock/
https://velog.io/@skyepodium/package.json
https://edu.goorm.io/learn/lecture/557/%ED%95%9C-%EB%88%88%EC%97%90-%EB%81%9D%EB%82%B4%EB%8A%94-node-js/lesson/174371/package-json

좋은 웹페이지 즐겨찾기