본문으로 바로가기

 

1. npm이 뭔가

  1.1. package.json

  1.2. package-lock.json과 node_modules

  1.3. npm install

2. semVer가 뭔가

3. npm 명령어

4. npm 패키지 배포하기

 


1. npm이 뭔가

node.js를 설치하면 딸려오는 npm에 대해서 알아보자. 지금까지 별 생각 없이 다음과 같은 코드를 입력하여 패키지를 설치해왔다면 이번 기회에 알아 보는 것도 나쁘지 않다. (제가 그렇습니다. 예..)

npm install express
npm install babel

 

npm에서 쇼핑하듯 패키지를 골라 가져다 자신의 프로젝트에 적용하는 방식이 흔하게 사용되고 있다. 이게 node가 인기있는 이유이다. 직접 다 구현할 필요없이 남들이 만든 패키지를 편하게 가져다 쓰면 개발 속도가 빨라진다.

 

1.1 package.json

npm init //package.json 생성

npm init를 실행하면 name, description, author 등을 입력하는 과정을 거친 후에 package.json이 생성됩니다. package.json은 말 그대로 패키지의 정보를 저장하고 있습니다. 패키지의 이름, version, 만든이 등등이 적혀 있으므로 설치한 패키지의 정보를 확인하고 싶다면 해당 패키지의 package.json을 살펴보는 것이 좋습니다.

 

또, 자신이 개발 중인 패키지에도 여러 가지 정보를 적거나 script를 적어 명령어를 등록하여 개발을 편리하게 만들 수도 있습니다. 보통 개발에 필요한 패키지는 --save-dev(-D로 축약 가능)로 저장하여 배포시에 포함이 되지 않게 합니다.

{
  "name": "nodebird-test1515",
  "version": "1.0.0",
  "description": "npm test",
  "main": "hello.js",
  "directories": {
    "test": "test"
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "nodemon --exec babel-node index.js --delay 2"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@babel/core": "^7.8.7",
    "@babel/node": "^7.8.7",
    "@babel/preset-env": "^7.8.7",
    "express": "^4.17.1"
  },
  "devDependencies": {
    "nodemon": "^2.0.2"
  }
}

 

1.2. package-lock.json과 node_modules

시험삼아 다음과 같이 express를 설치해보자.

npm install express

 

설치의 결과...

 

1️⃣ package-lock.jsonnode_modules가 설치되고

2️⃣ 자신이 개발 중인 package.json에는 dependencies에 express가 추가 됩니다.

 

node_modules에는 설치한 패키지가 요구하는 dependencies가 자동으로 설치되고 package-lock.json에는 설치한 패키지가 요구하는 dependencies가 무엇인지 적혀 있습니다. package.json에는 우리가 직접 설치한 패키지만 적혀 있는 반면 package-lock.json에는 설치한 패키지의 구동에 필요한 모든 dependencies가 적혀있는 셈입니다.

 

package-lock.json이나 node_modules는 git에 커밋하지 않습니다. package.json에 설치한 패키지의 내역이 들어가 있으므로 npm install만 입력하면 자동으로 설치하기 때문입니다. 중요한 것은 package.json입니다.

 

package-lock.json을 일부 가져와봤습니다. 아주 깁니다...

    "express": {
      "version": "4.17.1",
      "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
      "integrity": "sha512-mHJ9O79qM7VoeUVqgb27xlEMXTnYt4g==",
      "requires": {
        "accepts": "~1.3.7",
        "array-flatten": "1.1.1",
        ...중략
        "utils-merge": "1.0.1",
        "vary": "~1.1.2"
      },

 

1.3. npm install

npm i jest --save-dev // 배포 환경에서는 사용하지 않고 개발환경에서만 사용
npm i jest -D // --save-dev와 같음
npm i -D jest // 순서를 바꿔도 됨
npm i morgan cookie-parser express-session // 여러개 동시 설치 가능
npm i rimraf -g // 글로벌하게 설치. 인스톨 없이 바로 사용 가능
npm i -g npm // npm 업데이트
npm update -g npm // npm 업데이트
npm i express@4.14.0 // 설치할 버전을 명시해서 설치

종종 global하게 설치하고서 package.json에 없다고 말하곤 하는데 글로벌(전역 설치)하게 설치한다는 것은 명령어처럼 사전 작업없이 바로 쓸 수 있음을 말하므로 dependencies에 추가되지 않는다. 이러한 점 때문에 전역 설치를 싫어하는 사람도 있습니다. 자신이 뭘 설치했는지 알 수 없다는 이유 때문이죠.

 

2. semVer가 뭔가

semanticVersion의 줄임말이다. 세 자리로 구성된 버전 표현 방식이다.

major(대규모 변화). minor 버전(신기능). patch 버전(버그 수정)

"@babel/preset-env": "^7.8.7",
"cookie-parser": "^1.4.4",
"express": "^4.17.1",

맨 앞자리인 메이저 버전이 바뀌면 오류 확률이 높다. 따라서 새로운 사용방법을 익혀야 할 수도 있다. python 2.7과 3.7의 차이를 생각해보면 얼마나 크게 바뀌었는지 가늠해볼 수 있다. 마이너 버전을 고장이 안 난다고 가정한다. 물론 종종 마이너, 패치 수준 업데이트에서도 오류가 날 수도 있다. 따라서 버전 업그레이드에 앞서 오류가 나지 않는지 테스트를 해봐야 한다.

 

그런데 ^7.8.7에서 ^가 무슨 의미일까? 해당 패키지를 구동하는데 minor, patch 수준에서는 업그레이드 해도 된다는 의미이다. 아무 것도 없이 3.2.6 이런 식으로 있으면 꼭 그 버전을 설치해야 한다는 의미이고 >=7.8.7는 해당 버전보다 높거나 같은 것을 설치하면 된다는 의미이다. 이런 구문은 개발자 뿐만 아니라 npm update를 할 때도 유용하다. npm update를 할 때 ^7.8.7은 마이너, 패치 수준에서만 업데이트를 한다.

 

 

3. npm 명령어

npm i express@4.14.0 // 지정된 버전으로 설치합니다.

npm outdated // 오래된 버전을 체크합니다.
npm update // 업데이트 할 수 있는 것들을 모두 업데이트 합니다
npm update express // express만 업데이트 합니다.

npm remove morgan // 삭제
npm rm morgan // rm으로 줄임말 가능

npm serach express // npm가 가지고 있는 패키지 검색
npm info express // express 패키지의 package.json 출력

npm ls base // base 패키지가 왜 설치되었는지 dependencies 연결 고리를 보여줌

npm outdated, npm info
npm search, npm ls

 

4. npm 패키지 배포하기

 

npm 홈페이지에 우선 가입하자.

 

npm | build amazing things

Build amazing things We're npm, Inc., the company behind Node package manager, the npm Registry, and npm CLI. We offer those to the community for free, but our day job is building and selling useful tools for developers like you. Take your JavaScript devel

www.npmjs.com

 

가입 후 작업하는 명령창에서 유저 네임과 비밀번호를 입력하자.

npm adduser // 유저 추가
npm login // 로그인
npm whoami // 현재 무슨 계정?
npm logout // 로그아웃

 

 

배포하고자 하는 패키지의 버전을 직접 package.json을 수정할 수도 있지만 가급적이면 npm 명령어를 입력하자.

npm version 1.0.8
npm version patch
npm version minor // patch는 초기화
npm version major // patch와 minor 초기화

 

이제 배포를 해보자

npm publish
npm unpublish --force [패키지 이름] // 삭제

 

배포에 성공하면 다음과 같이 등록된다. npm search로도 검색이 가능해지고 npm info로 package.json을 명령창에서 확인할 수도 있다.

 

그리고 연습 후 패키지를 지울 때 지우기 위해서는 24시간 내로 지워야 한다. 지나가면 일반적인 방법으로는 지울 수 없다.


darren, dev blog
블로그 이미지 DarrenKwonDev 님의 블로그
VISITOR 오늘 / 전체