package.json
- 프로젝트의 루트 디렉토리에 위치하는 JSON 파일
- 프로젝트에 대한 메타데이터, 패키지 버전과 같은 기능적 메타데이터, 애플리케이션에서 필요한 의존성 리스트 포함
package.json 파일의 목적
package.json
은 애플리케이션과 상호작용하고 애플리케이션을 동작하는 방법을 구성하고 설명하는 파일
- npm 또는 yarn CLI를 사용해 프로젝트를 정의하고 프로젝트의 의존성을 다룰 수 있게 해주는 파일
- npm 또는 yarn이 프로젝트를 시작하고, 스크립트를 읽고, 의존성들을 설치하고, NPM 레지스트리에 퍼블리시하는 것들을 가능하게 해줌
package.json 파일의 공통 필드
package.json 파일의 여러 필드를 알고 있으면 이 파일의 사용 방법과 관리 방법에 대해 더 잘 이해할 수 있다.
name 필드
"name": "my-project"
- name 필드는 패키지의 이름을 정의함
- NPM 레지스트리에 패키지를 퍼블리싱하는 경우
- name 필드의 값이 패키지에 리스트됨
- name 프로퍼티는 필수적이고 유일해야 함
- NPM 레지스트리에서 현재 사용 중인 이름이라면 패키지를 퍼블리싱할 때 에러가 발생함
- 퍼블리시할 패키지가 아니라면 name은 유일하지 않아도 됨
version 필드
"version": "1.5.0"
- version 필드는 퍼블리시된 패키지나 퍼블리시되기 전의 패키지에게 아주 중요한 필드
- package.json 파일이 설명하는 현재 소프트웨어 버전을 나타냄
SemVer
를 반드시 사용할 필요는 없지만, Node.js 생태계에서 표준적으로 사용되므로 사용하는 것이 좋음
- 퍼블리시하지 않을 패키지라면 필수적이지 않음
license 필드
- license 필드를 사용하면 package.json 파일이 설명하는 코드에 적용되는 라이센스를 정의할 수 있음
- NPM 레지스트리에 퍼블리시하는 경우에 아주 중요함
- 일부 개발자들이나 조직에서 소프트웨어를 사용하는 것을 제한할 수 있음
- 명확한 라이센스가 있으면 소프트웨어를 사용할 수 있는 조건을 명확하게 정의하는 데 도움이 됨
author, contributors
"author": "Jon Church jon@example.com https://www.osioslabs.com/#team",
"contributors": [{
"name": "Amber Matz",
"email": "example@example.com",
"url": "https://www.osiolabs.com/#team"
}],
- author와 contributors 필드의 기능은 비슷함
- 두 필드 모두 "사람"에 대한 정보를 적는 필드로,
이름 <이메일> <url>
형식의 문자열을 값으로 사용하고, 이메일과 url은 선택적임
- author는 한 사람을 위한 필드, contributors는 여러 사람을 위한 필드
- 퍼블릭 프로젝트에 대한 연락처를 나열하기에 유용한 필드
description 필드
- description 필드는 NPM 레지스트리에 퍼블리시된 패키지를 위해 사용됨
- npm.js에서 패키지를 설명하는 필드
- 유저들이 NPM 레지스트리를 검색할 때 패키지가 무엇인지를 설명함
- NPM 레지스트리에 퍼블리시하지 않더라도 프로젝트에 대한 간단한 문서 역할을 할 수 있음
keywords 필드
"keywords": ["server", "osiolabs", "express", "compression"]
- keywords 필드는 description 필드와 비슷한 목적을 가짐
- NPM 레지스트리에서 인덱스되어 패키지를 찾는 사람들에게 도움을 줌
- NPM 레지스트리에 퍼블리시하지 않을거라면 생략 가능
main 필드
"main": "src/index.js",
- main 필드는 프로젝트의 진입점을 정의함
- 프로젝트의 진입점이란 프로젝트를 시작하기 위해 사용되는 파일을 의미함
- 일반적으로 프로젝트의 루트에 있는 index.js 파일이 프로젝트의 진입점
scripts 필드
"scripts": {
"start": "node index.js",
"dev": "nodemon"
}
- sciprts 필드는
npm run <스크립트이름>
형식으로 실행할 수 있는 스크립트를 키로 가지고 있는 객체이고, 그 값은 실행할 실제 명령어임
- 일반적으로 터미널 명령어로, scripts 필드에 넣어 쉽게 재사용할 수 있음
repository 필드
"repository": {
"type": "git",
"url": "https://github.com/osiolabs/example.git"
}
- repository 필드는 프로젝트의 코드가 있는 저장소에 대한 필드
- 소스코드가 위치한 url을 정의하고, 어떤 버전 컨트롤 시스템을 사용하는지를 객체로 저장함
dependencies 필드
"dependencies": {
"express": "^4.16.4",
"compression": "~1.7.4"
}
- dependencies 필드는 프로젝트가 사용하는 모든 의존성을 나열하는 필드
- 패키지를 설치하면 node_modules 폴더에 다운로드되고, 패키지의 이름과 버전이 dependencies 프로퍼티에 추가됨
- 패키지 이름을 키로, 버전이나 버전 범위를 값으로 갖는 객체를 저장함
- 이 리스트를 통해 npm은 어떤 패키지를 가져와 설치할지를 알 수 있음
(npm install
명령어 사용 시)
SemVer
사용: ^
과 ~
를 사용해 버전 범위를 나타냄
devDependencies 필드
"devDependencies": {
"nodemon": "^1.18.11"
}
dependencies
필드와 유사하지만, 개발 중에만 필요한 패키지를 위한 필드
nodemon
과 같이 개발 중에 프로젝트를 다시 로드하는 툴의 경우 애플리케이션이 배포되면 필요하지 않음
- 패키지를 devDependency로 설치하려면
npm install --save-dev <패키지이름>
를 사용함
package.json 관리하기
- package.json 파일은 반드시 유효한 JSON 파일이어야 함
- 가능하다면 package.json을 관리하고 업데이트하기 위해 npm CLI를 사용하는 것이 좋음
- npm CLI를 사용하면 의존성도 더 쉽게 관리할 수 있음
npm init
또는 yarn init
을 사용하면 package.json 파일을 생성할 수 있음
- npm CLI를 사용하는 것이 의존성을 가장 잘 관리할 수 있는데, package.json과 node_modules 폴더의 동기화를 유지할 수 있기 때문
- package.json에 의존성을 기록하고, node_modules 폴더에는 의존성에 대한 실제 코드가 설치되기 때문에, package.json의
dependency
필드를 수동으로 업데이트하면 node_modules 폴더에 즉각적으로 변경 사항을 반영할 수 없음
- 따라서 package.json과 node_modules를 동시에 업데이트하려면 npm을 사용해 의존성을 관리하는 것이 좋음
참고