Node Package Manager
Node.js의 기본 패키지 관리 도구이자, 세계 최대의 소프트웨어 레지스트리
프로젝트에서 패키지를 설치, 관리, 배포하는 기능을 제공
개발자가 필요한 외부 라이브러리나 도구를 쉽게 통합할 수 있다.
재사용 가능한 코드 모듈
Node.js 모듈, 라이브러리, 프레임워크 등
패키지는 보통 package.json 파일과 함께 배포된다.
패키지를 호스팅하는 중앙 저장소
npm의 기본 레지스트리는 https://registry.npmjs.org/ 이다.
express의 경우
https://registry.npmjs.org/express/-/express-4.19.2.tgz 경로에서 패키지를 다운받을 수 있다.
npm의 기본 레지스트리 변경하기 :
> npm config set registry `http://registry.npmjs.org/`
프로젝트 이름, 버전, 설명, 주요 파일, 스크립트. 의존성 목록을 정의하는 파일
{
"name": "my-project",
"version": "1.0.0", // major.minor.patch : (Semantic Versioning)
"description": "A simple Node.js project",
"main": "index.js",
"scripts": {
"start": "node index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"dependencies": { // 애플리케이션이 실행될 때 필요한 패키지
"express": "^4.17.1"
},
"devDependencies": { // 개발 중에만 필요한 패키지 (테스트 프레임워크 , 빌드 도구 등)
"mocha": "^8.2.1"
}
}
설치'된' 패키지의 정확한 버전과 의존성 트리를 기록한 파일
이 파일을 이용해서 다른 개발자라도 프로젝트의 의존성을 일관되게 설치할 수 있다.
{
"name": "my-project",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"express": {
"version": "4.17.1",
"resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
"integrity": "sha512-Yp+CF1Tx2x/A/2GFHDxwftPHLXLjoKOuy.../lGmH7riIhsv+k3x0+NOsA==",
"requires": {
"accepts": "~1.3.7",
"array-flatten": "1.1.1",
...
}
},
...
}
}
시맨틱 버전 : <메이저><마이너><패치>
메이저.마이너.패치
package.json 파일 생성> npm init
다음과 같이 대화형 CLI로 package.json 파일의 내용을 지정할 수 있다.
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.
See `npm help init` for definitive documentation on these fields
and exactly what they do.
Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.
Press ^C at any time to quit.
package name: (new_project) nameName
Sorry, name can no longer contain capital letters.
package name: (new_project) namename
version: (1.0.0) 2.1.1
description: 그냥 만든 프로젝트
entry point: (index.js) app.js
test command: mocha
git repository: https://anygitrepository.git
keywords: react, forntend, spa, javascript, html, css
author: mimimya
license: (ISC) MIT
About to write to C:\new_Project\package.json:
{
"name": "namename",
"version": "2.1.1",
"description": "그냥 만든 프로젝트",
"main": "app.js",
"scripts": {
"test": "mocha"
},
"repository": {
"type": "git",
"url": "https://anygitrepository.git"
},
"keywords": [
"react",
"forntend",
"spa",
"javascript",
"html",
"css"
],
"author": "mimimya",
"license": "MIT"
}
Is this OK? (yes)
> npm init -y
npm 이 정해주는 기본값으로 package.json 파일을 생성한다.
{
"name": "npm 실행 경로 (폴더명)",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
> echo "{}" > package.json
빈 내용을 가지는 package.json 파일을 직접 만든다.
npm ERR! JSON.parse Unexpected token '�', "��{}
npm ERR! JSON.parse " is not valid JSON while parsing '��{}
npm ERR! JSON.parse '
npm ERR! JSON.parse Failed to parse JSON data.
npm ERR! JSON.parse Note: package.json must be actual JSON, not just JavaScript.
위 처럼 npm이 package 파일을 제대로 읽지 못하는 문제가 생길 수 있어 비추한다.
npm install [@scope]<name>@<tag|version|version-range>
npm install <git저장소 주소>[#버전]
@scope : 패키지명의 중복을 회피하기 위해 사용
예를 들어 @types는 타입스크립트의 타입정의 패키지임을 명시하면서 중복을 피할 수 있다.
> npm install express@latest
> npm install lodash@4.17.20
> npm install lodash@^4.17.0
package.json파일의 dependencies 항목에 express 패키지가 추가된다.
| 버전 범위 | 설명 | 예시 |
|---|---|---|
| Caret (^) | "메이저 버전"이 변경되지 않는 한, "마이너"와 "패치 버전"에서 최신 버전 설치 | ^4.17.0 → 4.17.x, 4.18.x 등 최신 버전 |
| Tilde (~) | "패치 버전"만 업데이트, "마이너" 버전 변경 시 업데이트 안 됨 | ~4.17.0 → 4.17.x (패치 버전만 설치) |
| Greater than (>) | 해당 버전보다 "큰 버전" 설치 | >4.17.0 → 4.18.0, 5.0.0 등 설치 |
| Less than (<) | 해당 버전보다 "작은 버전" 설치 | <4.17.0 → 4.16.0, 4.15.0 등 설치 |
| Greater than or equal to (>=) | 해당 버전 이상 설치 | >=4.17.0 → 4.17.0, 4.18.0, 5.0.0 등 설치 |
| Less than or equal to (<=) | 해당 버전 이하 설치 | <=4.17.0 → 4.17.0, 4.16.0, 4.15.0 등 설치 |
| Exact Version (=) | 정확한 버전만 설치 | =4.17.0 → 정확히 4.17.0만 설치 |
| Wildcard (*) | 모든 버전 설치 (최신 버전으로 설치) | * → 최신 버전 설치 (예: 4.17.21) |
| Pre-release Versions (alpha, beta, next) | 프리릴리스 버전 설치 (미리보기, 베타 등) | lodash@next, lodash@beta → 다음 버전 또는 베타 버전 설치 |
배포 환경에서 사용할 패키지를 dependencies에 추가한다.
> npm install --save-dev mocha
> npm install -D jest
개발 중에만 사용하는 패키지를 devDependencies 항목에 추가한다.
프로젝트 디렉터리가 아닌 node가 설치된 디렉터리(주로 node-modules)에 추가한다.
npm root -g로 찾을 수 있다.
> npm install
> npm i
> npm add
package.json 파일에 명시된 모든 의존성을 읽고 해당 패키지들과 그 패키지에 필요한 하위 패키지들을node_modules 폴더에 설치한다.
package-lock-json 파일에 패키지의 버전과 해시값을 저장해 의존성 트리를 만들게 한다.
이미 설치된 패키지들을 (package.json 파일에 정의된 버전 범위 내에서) 최신 버전으로 업데이트 한다.
> npm update
> npm up
> npm upgrade
특정 패키지를 업데이트 한다.
> npm install express@latest
> npm install axios@^0.21.1
> npm uninstall express
> npm remove
> npm rm
> npm r
> npm un
node_modules디렉토리와 package.json파일에서 해당 패키지를 제거한다.
npm은 이미 설치된 패키지를 빠르게 다시 설치 할 수 있게 캐시를 사용한다.
> npm cache clean --force
캐시를 정리한다.
> npm prune
package.json 파일에 명시되지 않은 패키지를 node_modules 폴더에서 제거한다.
전체 의존성 트리를 확인
> npm list
> npm ls
> npm la
> npm ll
특정 패키지의 의존성 확인
> npm ls [@scope]<패키지명>
> npm ls --depth=1
의존성이 의존하는 패키지도 같이 확인
로그인에 성공하면, npm은 인증된 세션을 저장하여 이후 패키지 배포 시 인증 정보를 자동으로 사용하게 된다.
> npm login
Username: myUsername
Password: ********
Email: (this IS public) myEmail@example.com
배포 후, 다른 개발자는 npm install <패키지 이름> 명령어로 해당 패키지를 설치할 수 있게 된다.
> npm publish
패키지 이름은 고유해야 하므로, 이미 등록된 이름은 사용할 수 없다.
만약 중복되는 이름을 사용하려 하면, npm은 에러를 발생시킨다.
npm ERR! publish Failed PUT 409
npm ERR! 409 Conflict - You cannot publish over the existing package: my-awesome-package
npm ERR! Please use a different version number or package name.
--access public: 공개 패키지로 배포
> npm publish --access public
--tag: 특정 태그로 배포
> npm publish --tag beta