npm / package.json / semVer

woolee의 기록보관소·2022년 11월 26일
0

개발환경

목록 보기
11/17

npm?

npm(node package manager)은 node.js를 위한 패키지 관리자이자, node.js를 위한 오픈 소스 생태계이다.

  1. npm은 오픈 소스 node.js 프로젝트들 게시할 수 있는 온라인 저장소이다. node.js에서 사용할 수 있는 모듈들을 패키지화해서 모아두는 저장소 역할을 한다.
  2. 패키지의 설치, 버전 관리, dependency 관리 등을 지원하는 저장소와 상호작용할 수 있는 cli(command-line utility)를 제공한다.

수많은 node.js 라이브러리와 어플리케이션들이 npm에 게시되고 매일 추가된다. npm 에서 검색할 수 있고, 설치하고 싶다면 a single command-line command로 설치할 수 있다.

⇒ dependency management는 npm의 중요한 용도인데 package.json 파일이 있는 node 포르젝트가 있을 경우, npm install(또는 npm i)을 통해 package.json에 작성된 모든 dependencies들을 설치할 수 있다.

  • npm install은 현재 프로젝트에서 참조하는 npm 모듈들을 빌드하는 명령어이다. 현재 프로젝트의 package.json에 명시된 패키지들을 현재 경로 내 node_modules 폴더에 설치한다.

예를 들어, 아래와 같이 명령하면 package.json에 명시된 프로젝트 dependencies들을 포함하는 node_modules 폴더를 확인할 수 있다.

git clone https://github.com/cloudhead/vows.git
cd vows
npm install

npm을 사용하면 개발자가 코드를 쉽게 공유하고 업데이트할 수 있다. 예를 들어 웹 서비스를 구축하고 싶지만 처음부터 http 요청을 구성하는 건 부담스러울 수 있다. 이때 express 프레임워크를 사용하면 쉽게 해결할 수 있다. 하지만 공유가 쉬운 만큼 보안상 취약하기도 하다.

npm dependency resolution

npm install은 패키지와 패키지가 의존하는 모든 종속성(dependencies)을 다운로드한다. 하지만 때로 동일한 모듈이지만 다른 버전이 필요할 때가 있다.

package.json을 통해 종속성을 정확히 관리할 필요가 있으며, 부족한 부분을 pcakage-lock.json이 채워준다.

  • package-lock.json 파일이 존재하면 package.json이 아니라 package-lock.json을 사용해 node_modules를 생성한다.
    (package-lock.json은 node_modules 또는 package.json이 수정될 때마다 자동으로 생성되므로 package.json 파일에 매번 버전을 정확히 명시하는 것보다 편리하다.)

package.json을 생성하려면 프로젝트 루트에서 npm init 명령어를 실행한다. 하지만 일일이 다 입력하기 보다는 기본 설정값으로 생성된 package.json 파일을 수정하는 게 편리하므로 보통은 npm init -y(또는 npm init --yes) 명령어를 실행한다.

npm 버전 확인

npm --version (또는 npm -v) 

npm 최선 버전 업데이트

보통은 latest가 안전하다. next는 가장 최신?버전?인듯하다

npm install -g npm@latest 
npm install -g npm@next

node.js 업그레이드

npm 사용 시 node.js과 버전이 안 맞아서 에러가 발생할 수 있다.

node -v # 현재 Node.js 버전 확인 
sudo npm cache clear -f # 강제로 캐시 삭제 
sudo npm install -g n # n 모듈 설치 
sudo n stable

package.json

해당 프로젝트 디렉트리에서 package.json을 설치하려면

npm init

# 디폴트 값으로 초기화 하려면 (보통은 이걸로 초기값을 만든 후에 수정하는 게 편하다)
npm init --yes (또는 -y) 

이후 npm 패키지를 설치할 때 npm install 뒤에 패키지이름을 붙여주면 된다. 특정 버전을 사용하고 싶다면 @ 뒤에 버전을 작성하면 된다. (최근 버전에 이슈가 있을 수 있으므로 특정 버전을 사용하고 싶을 때)

npm install <package_name> # 예를 들어 npm install next
npm install <package_name> # 예를 들어 npm install next@12.1.6

전역설치와 지역설치
전역에 설치된 패키지는 운영체제마다 설치 경로가 다르다.

# 지역 설치 
npm install <package_name>

# 전역 설치 
npm install -g <package_name>

Dependency 추가하기

Node.js 프로젝트의 경우 많은 패키지를 사용할텐데 패키지마다 개별적으로 관리하기가 어렵다. 일괄 관리할 필요가 있고, npm은 package.json 파일로 프로젝트 정보와 패키지 의존성을 관리한다.

또한 package.json 파일에 dependencies 항목에 모듈들을 추가하면 한번에 설치할 수 있으므로 자주 쓰는 모듈들은 dependencies에 추가해서 한번에 관리하는 게 좋다.

이후에는 npm install만 해도 dependencies에 작성해놓은 패키지들을 설치한다.

dependencies는 주로 개발하는 어플리케이션이 직접적으로 사용하는 모듈들을 명시해놓은 곳. devDependencies은 개발자가 개발할 때만 사용하는 보조적인 모듈들을 명시해놓는 곳이다.

패키지를 설치할 때, save를 붙여주면 package.json 파일의 dependencies 항목에 모듈이 추가된다.

npm install <package_name> --save

npm5부터는 —-save 옵션을 기본 옵션으로 적용하므로 --save를 붙여주지 않아도 된다.

추가적인 옵션으로 의존성을 어떻게 저장할 것인지 설정할 수 있다.

# package.json의 dependencies에 패키지 등록 (default)
npm install <package_name> --P (또는 --save-prod)
# package.json의 devDepndencies에 패키지 등록 
npm install <package_name> -D (또는 --save-dev)
# package.json의 optionalDependencies에 패키지 등록 
npm install <package_name> -O (또는 --save-optional)
# dependencies에 패키지를 등록하지 않는다
npm install <package_name> --no-save

package.json - "main"

package.json 파일의 "main"은 프로그램의 기본 진입점(entry point)를 지정하는 곳이다.

상대 경로를 지정하지 않으면 root 폴더의 index.js가 기본값이다.

package.json - "engine"

package.json 파일의 "engine"은 패키지가 작동하는 Node 버전을 지정하는 곳이다.

버전 정보는 다양한 연산자(<, <=, >, >=, =, ^, ~)를 통해 표시할 수 있다.

패키지 버전을 @로 지정하거나 --save-exact 옵션을 지정하지 않으면 기본적으로 ^(캐럿)이 붙는다. ^(캐럿)이 붙으면 명시된 버전과 호환이 되는 버전의 업데이트를 허용한다는 의미이다.

npm 명령어 확인

npm help 

패키지 정보 확인

npm view <package_name>

전역 패키지

# 전역 패키지 설치 경로 
npm root -g 

# 전역 설치 패키지 확인 
npm ls -g --depth=0

패키지 설치 및 제거

# 로컬 설치
$ npm install <package-name>
# 전역 설치
$ npm install -g <package-name>
# 개발 설치
$ npm install --save-dev <package-name>
# package.json의 모든 패키지 설치
$ npm install

# 로컬/개발 패키지 제거
$ npm uninstall <package-name>
# 전역 패키지 제거
$ npm uninstall -g <package-name>

# 패키지 업데이트 
$ npm update <package-name>

semVer (Semantic Versioning)

npm은 semantic versioning을 지원한다.

캐럿(^)틸트(~) 버전의 차이는 다음과 같다.
캐럿은 명시된 버전과 호환 버전의 업데이트를 허용한다. 즉, Minor version 내에서 업데이트한다.

틸트는 명시된 버전과 근사한 버전의 업데이트를 허용한다. 즉, Patch version 내에서 업데이트 한다.

major 버전 번호는 호환되지 않는 API 변경이 있을 때 증가된다. 영향 받는 API를 사용하는 어플리케이션 및 기타 소프트웨어가 중단되므로 코드를 업데이트해야 한다.

minor 버전 번호는 새 기능이 이전 버전과 호환되는 방식으로 추가될 때 증가된다. 코드를 변경할 필요 없으며 새로운 마이너 버전으로 업데이트하는 게 가장 안전하다.

patch 버전 번호는 이전 버전과 호환되는 버그 수정이 있을 때 증가한다. 일부에서는 micro 버전이라 하기도 한다.

참고

What is npm?
A Beginner's Guide to NPM
npm-install
Package.json과 Package-lock.json의 차이를 아시나요?
package.json

처음 시작하는 Node.js 개발 - 2 - npm
Semantic Versioning
모듈화와 npm(node package manager)
모두 알지만 모두 모르는 package.json
npm install | how it works

profile
https://medium.com/@wooleejaan

0개의 댓글