npm (Node Package Manager) 사용법

dev_joo·2024년 6월 11일
post-thumbnail

npm?

Node Package Manager
Node.js의 기본 패키지 관리 도구이자, 세계 최대의 소프트웨어 레지스트리
프로젝트에서 패키지를 설치, 관리, 배포하는 기능을 제공
개발자가 필요한 외부 라이브러리나 도구를 쉽게 통합할 수 있다.

패키지 (Package)

재사용 가능한 코드 모듈
Node.js 모듈, 라이브러리, 프레임워크 등
패키지는 보통 package.json 파일과 함께 배포된다.

패키지 레지스트리 (Registry)

패키지를 호스팅하는 중앙 저장소
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/`

package.json

프로젝트 이름, 버전, 설명, 주요 파일, 스크립트. 의존성 목록을 정의하는 파일

{
  "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"
  }
}

package-lock.json

설치'된' 패키지의 정확한 버전과 의존성 트리를 기록한 파일
이 파일을 이용해서 다른 개발자라도 프로젝트의 의존성을 일관되게 설치할 수 있다.

{
  "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",
        ...
      }
    },
    ...
  }
}



npm 패키지 관리

Node.js 패키지들은 시맨틱 버전을 사용한다.

시맨틱 버전 : <메이저><마이너><패치>
메이저.마이너.패치

  • 메이저 : 기존 버전과 호환되지 않는 변경이 있을 때 올림
  • 마이너 : 이전 버전과 호환되지만 기능이 추가되면 올림
  • 패치 : 버그수정 등 호환성에 영향을 미치지 않는 변경이 있을 때 올림

npm 으로 패키지 관리하기


1. package.json 파일 생성

① npm init (파일의 내용 직접 지정)

> 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 (기본값 사용)

> 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 파일을 제대로 읽지 못하는 문제가 생길 수 있어 비추한다.


2. 의존성 추가

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.04.17.x, 4.18.x 등 최신 버전
Tilde (~)"패치 버전"만 업데이트, "마이너" 버전 변경 시 업데이트 안 됨~4.17.04.17.x (패치 버전만 설치)
Greater than (>)해당 버전보다 "큰 버전" 설치>4.17.04.18.0, 5.0.0 등 설치
Less than (<)해당 버전보다 "작은 버전" 설치<4.17.04.16.0, 4.15.0 등 설치
Greater than or equal to (>=)해당 버전 이상 설치>=4.17.04.17.0, 4.18.0, 5.0.0 등 설치
Less than or equal to (<=)해당 버전 이하 설치<=4.17.04.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 → 다음 버전 또는 베타 버전 설치

install 옵션

-P --save-prod (기본 옵션)

배포 환경에서 사용할 패키지를 dependencies에 추가한다.

-D --save-dev

> npm install --save-dev mocha
> npm install -D jest

개발 중에만 사용하는 패키지를 devDependencies 항목에 추가한다.

-g --global

프로젝트 디렉터리가 아닌 node가 설치된 디렉터리(주로 node-modules)에 추가한다.
npm root -g로 찾을 수 있다.


3. 패키지 설치 (의존성 트리 구축)

> npm install
> npm i
> npm add

package.json 파일에 명시된 모든 의존성을 읽고 해당 패키지들과 그 패키지에 필요한 하위 패키지들을node_modules 폴더에 설치한다.

package-lock-json 파일에 패키지의 버전과 해시값을 저장해 의존성 트리를 만들게 한다.

4. 패키지 업데이트

이미 설치된 패키지들을 (package.json 파일에 정의된 버전 범위 내에서) 최신 버전으로 업데이트 한다.

> npm update
> npm up
> npm upgrade

특정 패키지를 업데이트 한다.

> npm install express@latest
> npm install axios@^0.21.1

5. (특정) 패키지 제거

> npm uninstall express
> npm remove
> npm rm
> npm r
> npm un

node_modules디렉토리와 package.json파일에서 해당 패키지를 제거한다.

6. 캐시 정리

npm은 이미 설치된 패키지를 빠르게 다시 설치 할 수 있게 캐시를 사용한다.

> npm cache clean --force

캐시를 정리한다.


7. 패키지 정리

> npm prune

package.json 파일에 명시되지 않은 패키지를 node_modules 폴더에서 제거한다.

8. 패키지 확인

전체 의존성 트리를 확인

> npm list
> npm ls
> npm la
> npm ll

특정 패키지의 의존성 확인

> npm ls [@scope]<패키지명>

--depth 옵션

> npm ls --depth=1

의존성이 의존하는 패키지도 같이 확인

npm 레지스트리에 배포하기

로그인

로그인에 성공하면, npm은 인증된 세션을 저장하여 이후 패키지 배포 시 인증 정보를 자동으로 사용하게 된다.

> npm login
Username: myUsername
Password: ********
Email: (this IS public) myEmail@example.com

배포

배포 후, 다른 개발자는 npm install <패키지 이름> 명령어로 해당 패키지를 설치할 수 있게 된다.

> npm publish

배포시 패키지 이름

  • 패키지 이름은 package.json의 name 속성을 따른다.
  • npm 레지스트리에서 패키지 이름은 소문자와 하이픈(-)만 허용한다.

패키지 이름은 고유해야 하므로, 이미 등록된 이름은 사용할 수 없다.
만약 중복되는 이름을 사용하려 하면, 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
profile
풀스택 연습생. 끈기있는 삽질로 무대에서 화려하게 데뷔할 예정 ❤️🔥

0개의 댓글