[Node.js] npm
▶ 패키지매니저
▷ npm이란
npm(Node Package Manager)은 노드의 패키지 매니저이며 다른 사람들이 만든 소스 코드들을 모아둔 저장소이다.
- 패키지: npm에 업로드된 노드 모듈
- ★모듈이 다른 모듈을 사용할 수 있듯 패키지도 다른 패키지를 사용할 수 있음 (의존관계)
왜 npm을 사용하는가?
- 남의 코드를 이용하여 프로그래밍 가능
- 이미 있는 기능을 다시 구현할 필요가 없어 효율적
▶ package.json으로 패키지 관리하기
▷ package.json란
- 설치한 패키지의 버전을 관리하는 파일
-
같은 패키지라도 버전별로 기능이 다를 수 있으므로 버전을 기록해두어야 한다. (버전이 다를시 문제 발생할 수 있다.)
- 노드 프로젝트 시작 전 반드시 package.json부터 만들고 시작해야한다. (
npm init
명령어 입력)
질문!
npm
과init
은 무엇을 의미할까?
npm
은 package.json을 만드는 명령어를 제공하며,
init
은initialize(초기화)를 의미한다.
▷ package.json 만들기
터미널이나 cmd에 npm init
입력 후 아래와같이 임력하기
package name: (폴더명) [프로젝트 이름 입력] version: (1.0.0) [프로젝트 버전 입력] description: [프로젝트 설명 입력] entry point: index.js test command: [엔터 키 클릭] git repository: [엔터 키 클릭] keywords: [엔터 키 클릭] author: [여러분의 이름 입력] license: (ISC) [엔터 키 클릭]
- 예시로 프로젝트 이름은 npmtest, 버전은 0.0.1, 설명은 hello package.json, author는 sieun으로 설정하였다.
▷ package.json의 속성들
• package name: 패키지의 이름입니다. package.json의 name 속성에 저장됩니다.
• version: 패키지의 버전입니다. npm의 버전은 다소 엄격하게 관리됩니다. 5.3절에서 다룹니다.
• entry point: 자바스크립트 실행 파일 진입점입니다. 보통 마지막으로 module.exports를 하는 파일을 지정합니다. package.json의 main 속성에 저장됩니다.
• test command: 코드를 테스트할 때 입력할 명령어를 의미합니다. package.json scripts 속성 안의 test 속성에 저장됩니다.
• git repository: 코드를 저장해둔 깃(Git) 저장소 주소를 의미합니다. 나중에 소스에 문제가 생겼을 때 사용자들이 이 저장소에 방문해 문제를 제기할 수도 있고, 코드 수정본을 올릴 수도 있습니다. package.json의 repository 속성에 저장됩니다.
• keywords: 키워드는 npm 공식 홈페이지(https://npmjs.com)에서 패키지를 쉽게 찾을 수 있게 합니다. package.json의 keywords 속성에 저장됩니다.
• license: 해당 패키지의 라이선스를 넣으면 됩니다.
▷ 스크립트 실행
npm rum [프로젝트명]
으로 스크립트 실행
▶ 패키지 설치방법
npm install [패키지 이름]을 package.json이 있는 폴더의 콘솔에서 입력하면 설치가 된다.
npm install express
입력하여 패키지 설치
(install
대신 i
입력 가능)
설치된 패키지는 package.json에 기록된다.
▷ 자동 생성된 폴더
npm install
시 node_modules 폴더 자동 생성되었다.
node_modules 폴더 내부에 설치한 패키지들이 들어있다.
-
분명히 Express 하나만 설치했는데 패키지가 여러 개 들어 있다.
-
이는, express 외에도 express와 의존 관계가 있는 패키지들이 모두 설치된 것이다.
-
이렇게 의존 관계가 복잡하게 얽혀 있어 package.json이 필요한 것이다.
아까도 말했듯 ★모듈이 다른 모듈을 사용할 수 있듯 패키지도 다른 패키지를 사용할 수 있는 것을 의존관계라고 한다.
package-lock.json도 생성되어 패키지간 의존 관계를 명확하게 표시하였다. (package.json은 직접 설치한 패키지를 기록하는 파일이다.)
▷ 모듈 여러 개 동시 설치
npm i 패키지1 패키지2 패키지3
로 패키지 동시 설치 가능하다.
▷ 개발용 패키지 설치
- 개발용 패키지는 실제 배포 시에는 사용되지 않고, 개발 중에만 사용된다.
stall --save-dev [패키지] [...]
로 설치 가능하다.- –save-dev가 개발용 패키지임을 나타낸다.
▷ 글로벌(전역) 설치
- 패키지를 현재 폴더의 node_modules에 설치하는 것이 아니라 npm이 설치되어 있는 폴더에 설치하는 것이다.
-
모든 프로젝트와 콘솔에서 패키지를 사용할 수 있다.
npm install --global 패키지명
또는npm i --g 패키지명
로 설치 가능 하다.
-
전역 설치한 패키지는 package.json에 기록되지 않아 다시 설치할 때 어려움이 있으므로 추천 x
-
대신 npx를 사용하면 글로벌 설치 없이 글로벌 명령어 사용 가능
## ▷ node_modules 내부 수정하기
-
node_modules 내부의 수정 사항을 영구적으로 반영해주는 patch-package 패키지 사용
-
package.json을 아래와 같이 수정하고 patch-package 패키지를 설치
-
- package.json 수정
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"postinstall": "patch-package"
},
- patch-package 패키지 설치
npm i patch-package
(node_modules 내부의 원하는 패키지 수정하기)
npx patch-package [수정한 패키지 이름]
-
이러면 patches 폴더가 생성되고 그 안에 patch 확장자를 가진 파일이 생성된다.
-
이후
npm i
를 해도 patch-package가 patch 파일을 읽어서 수정 사항을 적용한다.
▶ 패키지 설치하기
▷ express 패키지
npm install express
입력
(install
대신 i
입력 가능)
▷ morgan cookie-parser,express-session 패키지
npm install morgan cookie-parser express-session
▷ nodemon 패키지
소스 코드가 바뀔 때마다 자동으로 노드를 재실행해주는 패키지이다.
npm install --save-dev nodemon
▷ rimraf 패키지
- rimraf는 리눅스나 맥의 rm -rf 명령어를 윈도에서도 사용할 수 있게 해주는 패키지이다.
-
rm -rf는 지정한 파일이나 폴더를 지우는 명령어이다.
- 설치방법1 전역패키지로 설치 (추천x):
npm i --g rimraf
- 설치방법2 npx으로 설치:
npx rimraf
npx으로 node_modules 삭제해보자
rimraf node_modules
입력하기
삭제된 모습 확인할 수 있다.
- node_modules는 언제든지 npm install로 설치할 수 있으므로 node_modules는 보관할 필요가 없다.
-
깃 같은 버전 관리 프로그램과 같이 사용할 때도 node_modules는 커밋하지 않는다.
- 요한 파일은 package.json과 package-lock.json이다.
▶ 패키지 버전 이해하기
▷ SemVer
- 노드 패키지들의 버전은 항상 세 자리로 이뤄져 있는데, SemVer 방식의 버전 넘버링을 따르기 때문이다.
- SemVer는 Semantic Versioning(유의적 버저닝)의 약어로 버전을 구성하는 세 자리가 모두 의미를 갖고 있다는 뜻이다.
질문! 왜 SemVer 방식을 사용할까?
노드에서는 배포를 할 때 항상 버전을 올려야 하는데 각각의 패키지는 모두 버전이 다르기 때문에 버전 번호를 어떻게 정하고 올려야 하는지를 명시하는 규칙이 필요하기 때문!
-
major: 메이저 버전은 하위 호환이 안 될 정도로 패키지의 내용이 수정되었을 때 올림 예를 들어 1.5.0에서 2.0.0으로 올렸다는 것은, 1.5.0 버전 패키지를 사용하고 있던 사람들이 2.0.0으로 업데이트했을 때 에러가 발생할 확률이 크다는 뜻
-
minor: 마이너 버전은 하위 호환이 되는 기능 업데이트를 할 때 올림. 버전을 1.5.0에서 1.6.0으로 올렸다면, 1.5.0 사용자가 1.6.0으로 업데이트했을 때 아무 문제가 없어야 함
-
patch: 새로운 기능이 추가되었다기보다는 기존 기능에 문제가 있어 수정한 것을 내놓았을 때 패치 버전을 올림. 당연히 업데이트 후 아무 문제가 없어야 함
▷ 버전기호
- 버전 앞에 기호를 붙여 의미를 더한다.
▶ 기타 npm 명령어
npm outdated
: 어떤 패키지에 기능 변화가 생겼는지 알 수 있음
-> Current와 Wanted가 다르다면 업데이트가 필요한 경우이다. 이럴 때는 npm update [패키지 이름]
으로 업데이트할 수 있다.
-> npm update
를 하면 업데이트 가능한 모든 패키지가 Wanted에 적힌 버전으로 업데이트된다.
-> Latest는 해당 패키지의 최신 버전이지만 package.json에 적힌 버전 범위와 다르다면 설치되지 않는다.
npm uninstall 패키지명
: 패키지 삭제(npm rm 패키지명
으로도 가능)
-> node_modules 폴더와 package.json에서 사라짐 -> pm rm [패키지 이름]으로 줄여 쓸 수도 있음
npm search 검색어
: npm 패키지를 검색할 수 있음
-> 윈도나 맥에서는 브라우저를 통해 npm 공식 사이트(https://npmjs.com)에서 검색하면 편리
npm info 패키지명
: 패키지의 세부 정보 파악 가능
-> package.json의 내용과 의존 관계, 설치 가능한 버전 정보 등이 표시
-
npm adduser
: npm에 로그인을 하기 위한 명령어 -
npm whoami
: 현재 사용자가 누구인지 알려줌 -
npm logout
: 로그인한 계정을 로그아웃 -
npm version 버전
: package.json의 버전을 올림 -
npm publish
: 자신이 만든 패키지를 배포할 때 사용 -
npm unpublish
: 배포한 패키지를 제거할 때 사용(24시간 이내에 배포한 패키지만 제거 가능)
npm deprecate [패키지 이름] [버전] [메시지]
: 해당 패키지를 설치할 때 경고 메시지를 띄우게 함
-> 다른 사용자들이 버그가 있는 버전의 패키지를 설치할 때 경고 메시지가 출력
이외에도 많은 명령어가 있는데, npm 공식 문서(https://docs.npmjs.com/)의 CLI Commands에서 확인 가능하다.
▶ 패키지 배포 및 취소
▷ 패키지 배포하기
- 회원가입
-
npm 웹 사이트(https://www.npmjs.com) 우측 상단의 Sign Up을 눌러 회원 가입하기
-
회원 가입 confirm 메일을 확인하기
-
콘솔에서 npm login 명령어를 입력해 생성한 계정으로 로그인하기(가입 시 입력했던 이메일로 OTP 입력해야 로그인된다.)
- 배포할 패키지 작성
-
패키지로 만들 코드를 작성하기
-
package.json의 main 부분의 파일명과 일치해야 한다(npm에서 이 파일이 패키지의 진입점임을 알 수 있기때문)
- 배포 시도하기
npm adduser
로 먼저 로그인 한 후npm publish
입력
- npmtest란 이름을 누가 사용중이기 때문에 에러 발생
-
이름이 겹치면 안되므로 다른 것으로 바꿔서 배포
-
누군가가 이름을 사용하고 있는지 확인하기:
npm info [패키지 이름]
- package.json에서 원하는 이름으로 name을 바꾸고, 다시 npm publish 명령어를 입력
▷ 패키지 배포 취소하기
72시간 내에 npm unpublish 패키지명 --force
입력
댓글남기기