본문 바로가기
나의 개발일지/node.js

[nodejs | 노드js] package.json

by stella_gu 2022. 7. 31.

▼ package.json

  • npm에서 핵심적인 역할을 하며, 패키지에 관한 정보와 의존 중인 버전에 관한 정보를 담고 있다.
  • 패키지 내의 의존성 관리를 위해 프로젝트마다 생성하여 패키지 목록과 버전을 관리한다.
  • 프로젝트명, 버전, 만든 사람, GitHub 레포지토리 등 설치된 모듈의 정보가 담겨 있으며, 해당 프로젝트가 의존하고 있는 모듈이 무엇인지 파악할 수 있다.
  • 누군가의 프로젝트를 클론할 때에도 유용하게 쓰인다. npm install 명령어만 이용하면 package.json 파일의 정보를 읽어 필요한 라이브러리를 모두 설치할 수 있다.

 

{
  "name": "zerocho-blog",
  "version": "2.8.1",
  "description": "blog of ZeroCho",
  "private": true,
  "keywords": ["zerocho", "blog"],
  "homepage": "https://www.zerocho.com",
  "bugs": {
    "url": "www.zerocho.com",
    "email": "zerocho@zerocho.com"
  },
  "license": "MIT",
  "author": "Zero Cho <zerocho@zerocho.com> (https://www.zerocho.com)",
  "repository": {
    "type": "git",
    "url": "https://github.com/zerocho/zerocho"
  },
  "main": "server/index.js",
  "scripts": {
    "start": "node server/index.js",
    "preinstall": "rimraf node_modules"
  }
  "engines": {
    "node": "7.x",
    "npm": "3.x"
  },
  "dependencies": {...},
  "devDependencies": {...}
}

 

  • name과 version : 필수요소
  • description과 keywords : 각각 설명과 키워드를 알려주어 사람들이 검색할 때 쉽게 찾을 수 있게 해준다.
  • private : 패키지를 비공개할건지 여부를 알려준다. (true: 공개, false: 비공개) 
  • bugs : 버그가 발생할 시 제보할 곳
  • author : 제작자의 정보
  • repository : 코드가 저장되어있는 곳의 정보
  • main : 패키지의 메인 파일이 뭔지를 알려줌
  • scripts : npm 명령어를 알려줌. 위의 경우 npm start 하면 node server/index.js라는 명령어가 실행되고, preinstall은 누군가가 이 패키지를 install했을 때 설치하기 전에 하는 행동을 명시한다. script는 임의로 설정할 수 있다. scripts에 build라는 명령어를 만들었으면 npm run build하면 해당 명령어가 실행된다.
  • engines, os, cpu : 위 파일에는 들어가있지 않지만, 이 패키지가 특정한 환경에만 동작하도록 하는 속성을 나타낸다.

 

※ dependencies, devDependencies, peerDependencies

프로젝트를 진행하면서 여러가지 패키지들을 사용(의존)하게 되는데, 패키지들의 버전이 빠르게 변하다보니 관리하기가 힘든 경우가 많다. package.json은 의존중인 패키지들의 버전을 기록해준다.

세 가지 종류로 기록을 해 주는데 바로 dependencies, devDependencies, peerDependencies입니다.

 

dependencies는 일반적인 경우 의존하고 있다는 것을 알려주는 곳이고, devDependencies는 개발 모드일 때만 의존하고 있다는 것을 알려준다.

devDependencies는 실제로 배포할 때는 필요없는 테스트 도구나 웹팩, 바벨같은 것들을 넣어두면 된다.

peerDependencies가는 직접 require은 하지 않지만 호환되는 패키지의 목록으로, 주로 자기가 어떤 패키지의 플러그인 같은 개발할 때 사용한다. 

 

 

 버전

[메이저(major)].[마이너(minor)].[패치(patch)]의 3단계로 구성. (메이저가 0일 때는 0.[메이저].[마이너] 또는 0.0.[메이저])

메이저는 대규모 업데이트(이전 버전과 호환 안 됨), 마이너는 소규모 업데이트(이전 버전과 호환은 됨), 패치는 버그 수정 시에 버전을 올린다. npm에서 특정 버전을 설치하고 싶다면 npm install [패키지명]@버전하면 된다.

 

위의 예시를 보시면 버전 앞에 저마다 다른 기호가 붙어있다.

  • 그냥 숫자는 무조건 그 버전을 설치해야한다는 뜻.
  • 부등호(>, >=, <=, <)는 해당 부등호에 일치하면 된다는 뜻.
  • x 표시는 어떤 숫자든지 괜찮다는 뜻. latest는 가장 최신 버전을 설치하라는 뜻.
  • ^(캐럿, caret)은 버전의 범위가 업데이트될 수 있다는 뜻.

 

~는 패치버전까지 변경을 허용하고, ^는 마이너버전까지 변경을 허용한다.

예를 들어, ~1.3.2가 있으면 1.3.8은 허용하지만 1.4.0은 허용하지 않는다. ^1.3.2가 잇으면 1.4.5는 허용하지만, 2.0.0은 허용하지 않는다. (^이 조금 더 여유로운 개념으로 npm은 ^을 기본값으로 두고 있다)

 

 

 

 

※ package-lock.json

  • 설치 패키지와 그에 의존하는 패키지 항목을 모두 관리
  • 하나의 패키지에는 수많은 의존성 모듈이 있어 모듈 버전은 항상 최적화가 필요하다. 단 한 개의 모듈이라도 다른 모듈의 버전과 호환되지 않으면 해당 패키지는 사용할 수 없게 된다.
  • package.json만으로는 프로젝트의 정보가 부족하므로, package.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) 의존성을 가진 패키지가 의존하는 패키지의 버젼이 업그레이드 되는 경우

 

→ 모든 개발자가 같은 node_modules를 가지고 작업하기 위해 pacakge-lock.json은 형상관리에 포함시켜야함 (그래서 Github에 같이 Push하는 것.)

 

 

 

 

 

[참고] https://docs.npmjs.com/cli/v8/configuring-npm/package-json

 

package.json | npm Docs

Specifics of npm's package.json handling

docs.npmjs.com

[참고] https://www.zerocho.com/category/NodeJS/post/5825a3caaff5c70018279975

[참고] https://dschci.tistory.com/108