LHJ

I'm a FE developer.

package.json

26 Aug 2020 » node

package.json

npm에서 핵심적인 역할을 한다.
패키지에 관한 정보와 의존 중인 버전에 관한 정보를 담고 있다.
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라서 위 패키지는 다른사람이 볼 수 없습니다.

  • bugs : 버그가 발생할시 제보할 곳입니다.

  • author : 제작자의 정보입니다.

  • repository : 이 코드가 저장되어있는 곳의 정보입니다.

  • main : 이 패키지의 메인 파일이 뭔지를 알려줍니다.

  • scripts : 여러가지 npm 명령어를 알려줍니다.

  • npm start : node server/index.js 라는 명령어가 실행됩니다.

  • preinstall : 누군가가 이 패키지를 install 하였을 때 설치하기 전에 하는 행동을 말합니다.

  • postinstall : 설치한 후의 동작을 말합니다.

publish, uninstall, start, restart, test, version 등이 있습니다.
모두 pre나 post를 붙일 수 있습니다.
임의로 자기가 script를 만들어도 됩니다.

  • 명령어 : scriptsbuild라는 명령어를 만들었으면 npm run build하면 해당 명령어가 실행됩니다.

  • engines, os, cpu : 위 패키지에는 없지만, 이 패키지가 특정한 환경에서만 동작하도록 하는 속성입니다.

dependencies, devDependencies, peerDependencies

프로젝트를 진행하면 여러가지 패키지들을 사용(의존)하게 됩니다.
패키지들의 버전이 빠르게 변하다보니 관리하기 힘든 경우가 많습니다.
package.json은 의존(사용) 중인 패키지들의 버전을 기록해줍니다.
세 가지 종류로 기록을 해주는데 바로 dependencies, devDependencies, peerDependencies 입니다.

dependencies는 일반적인 경우 의존하고 있다는 것을 알려주는 곳이고,
devDependencies는 개발 모드일 때만 의존하고 있다는 것을 알려주는 겁니다.
devDependencies는 실제로 배포할 때는 필요없는 테스트 도구나 웹팩, 바벨 같은 것들을 넣어두면 됩니다. peerDependencies는 직접 require은 하지 않지만 호환되는 패키지의 목록입니다.

주로 자기가 어떤 패키지의 플러그인을 개발할 때 사용합니다.

제로초분이 만든 react-vote, react-filepicker 같은 것은 모두 peerDependencies로 react@15.3.x를 두고 있습니다.

버전

{
  "dependencies": {
    "express": "4.14.0",
    "fb": "^1.1.1",
    "cors": ">2.5.1 <=2.8.1",
    "mongoose": "~4.6.6",
    "morgan": "1.x",
    "nodemon": "latest"
  }
}

버전은 조금 헷갈리는 요소입니다.
[메이저].[마이너].[패치] 이렇게 3단계로 구성됩니다.
(메이저가 0일 때는 0.[메이저].[마이너] 또는 0.0.[메이저]입니다.)

  • 메이저는 대규모 업데이트(이전 버전과 호환이 안됨)
  • 마이너는 소규모 업데이트(이전 버전과 호환은 됨)
  • 패치는 버그 수정 시에 버전을 올립니다.

npm에서 특정 버전을 설치하고 싶다면 npm install [패키지명]@버전을 하면 됩니다.

위의 예시를 보시면 버전 앞에 저마다 다른 기호가 붙어있습니다.
그냥 숫자도 있고, ^, ~, 부등호, x, latest 등이 있습니다.

  • 숫자 : 무조건 해당 버전을 설치해야 됩니다.
  • 부등호(&gt, &gt=, &lt=, &lt) : 해당 부등호에 일치하면 됩니다.
  • x : 어떤 숫자든지 괜찮다는 뜻입니다.
  • latest : 최신 버전을 설치하라는 뜻입니다.
  • ~ : 패치버전까지 변경을 허용한다는 뜻입니다.
  • ^ : 마이너버전까지 변경을 허용한다는 뜻입니다.

~1.3.2는 1.3.8은 허용하지만 1.4.0은 허용하지 않습니다.
^1.3.2는 1.4.5는 허용하지만 2.0.0은 허용하지 않습니다.
^이 조금 더 여유로운 개념입니다.

npm^을 기본값으로 두고 있습니다.

package.json에 대해 자세하게 알고싶으시면 공식 문서를 참조하세요.
다음 시간에는 npm 명령어에 대해 알아보겠습니다.