Node.js package.json과 의존성

dependencies vs devDependencies vs peerDependencies

Package.json

패키지에 관한 정보와 의존중인 버전에 관한 정보를 가진 파일

{
  "name": "create-reactjs-generator",
  "version": "1.0.8",
  "description": "Reactjs app generator.",
  "keywords": [
    "react"
  ],
  "bin": {
    "create-reactjs-generator": "./lib/index.js"
  },
  "author": "seungdeok <akk9132@naver.com>",
  "homepage": "https://github.com/seungdeok/create-reactjs-generator",
  "license": "MIT",
  "main": "lib/createReactjsGenerator.js",
  "directories": {
    "lib": "lib",
    "test": "__tests__",
    "templates": "templates"
  },
  "files": [
    "lib"
  ],
  "repository": {
    "type": "git",
    "url": "git+https://github.com/seungdeok/create-reactjs-generator.git"
  },
  "scripts": {
    "test": "node ./__tests__/createReactjsGenerator.test.js"
  },
  "bugs": {
    "url": "https://github.com/seungdeok/create-reactjs-generator/issues"
  },
  "dependencies": {},
  "devDependencies": {},
  "peerDependencies": {}
}

위는 제 repository 중 하나를 예시로 가져왔습니다.

이 밖에도 다양한 필드가 있지만 공식문서arrow-up-right의 설명을 참고해서 알아보았습니다.

필드 설명(기본적으로는 모두 선택값)

  • name

    • 패키지를 게시한다면 필수값

    • 프로젝트의 이름

  • version

  • description

    • 프로젝트 설명

    • npm 검색에서 활용

  • keywords

    • 프로젝트 키워드

    • npm 검색에서 활용

  • homepage

    • 프로젝트 homepage 링크

  • bugs

    • 이슈 보고할 링크와 메일 정보

  • license

    • 패키지의 사용 범위를 설명하는 라이센스 표기(ex. MIT, UNLICENSED = 미공개 원할 시)

  • 기여자 정보

    • 1명: author

    • 2명이상: contributors

  • funding

    • 자금 지원 방법에 대한 링크

  • files

    • 파일이 종속성으로 설치될 때(.gitignore의 패턴을 따른다, 기본값은 *)

  • main

    • 기본 진입점인 모듈(기본값은 root폴더의 index.js)

  • browser

    • 모듈을 client에서 사용하는 경우

  • bin

    • 패키지 설치 맵(전역의 bin에 없으면 로컬의 bin으로 링크됩니다)

  • man

    • man 프로그램이 찾을 수 있도록 지정

  • directories

    • bin, doc, lib, man을 패키지 구성으로 사용할 수 있는 필드(CommonJS 스펙)

  • repository

    • 코드 위치 링크

  • scripts

    • 라이프 사이클 스크립트(pre*, post*)

    • npm은 prepare, prepublish, prepublishOnly, prepack, postpack, dependencies

    • yarn v2+는 prepack, postpack, prepublish, postintall

  • config

    • 지속되는 매개변수

  • dependencies

    • 의존하고 있는 패키지 목록

  • devDependencies

    • 개발에서만 의존하는 패키지 목록

  • peerDependencies

    • 직접 사용하는 것은 아니지만 의존하는 패키지의 목록

    • npm v6에서는 경고 npm v7부터는 오류 발생 시켜 설치 불가

  • bundleDependencies

    • 번들로 묶을 패키지 목록

  • optionalDependencies

    • 종속성을 찾을 수 없거나 실패한 경우 설치 실패 우회

  • engines

    • 동작가능한 Node 버전 지정 가능(실행기반 설정)

  • os

    • 운영체제 설정

  • cpu

    • 특정 CPU 사용 설정

  • private

    • publish를 허용할지 여부

  • publishConfig

    • publish에서 사용한 매개변수

  • workspaces

    • yarn, npm v7+

    • 패키지의 path를 추가하면 링크된다

Package manager 동작 방식

Resolution -> 모든 의존성 버전 고정

  • 라이브러리 버전 고정

  • 라이브러리의 다른 의존성 확인

  • 라이브러리의 다른 의존성 버전 고정

Fetch

  • 결정된 버전의 파일 다운로드

  • Resolution/Fetch된 라이브러리를 소스 코드에서 사용할 수 있도록 제공

  • npm linker

    • 모든 의존성을 node_modules 아래에 하나하나 쓰는 것

  • pnpm linker

    • Hard link(alias)를 걸어서 node_modules 밑에 쓰다가 있으면 추가 설치 안하는 것

  • PnP(Plug and Play) linker

    • npm or yarn PnP 모드

    • Javascript Map 객체로 의존성 관리(.pnp.cjs 파일)

Dependencies vs DevPendencies vs PeerDependencies

Dependencies

  • 프로덕션 혹은 런타임에서 사용

DevPendencies

  • 개발 종속성일 경우에 사용(프로덕션 빌드에 포함안된다)

PeerDependencies

해당 라이브러리를 사용하게 될 프로젝트에게 특정 버전을 요구하는 것

yarn은 warning

npm은 버전에 따라 상이

  • npm v3에서는 자동 설치

  • npm v4 ~ v6는 warning

  • npm v7+ error

Refererence

Last updated