npm의 의존성 관리
npm은 package.json
파일을 통해 프로젝트 정보와 패키지 정보를 관리한다.
$ npm init
명령어 실행 시 프로젝트에 대한 이름, 버전, 라이선스 등 여러가지 정보를 입력하고,
이 정보를 기준으로 pakage.json이 생성된다.
의존성 설치와 제거
$ npm install
명령어 뒤에 설치할 패키지를 입력하면 패키지의 가장 최신 버전이 설치된다.
설치 명령어는 지역(local) 설치와 전역(global) 설치 옵션이 존재한다.
지역 설치
- 옵션을 별도로 지정하지 않으면 지역 설치가 된다.
- 프로젝트 루트에 node_modules 폴더가 자동으로 생성되고, 패키지가 설치된다.
- 지역 설치된 패키지는 해당 프로젝트 내에서만 사용할 수 있다.
-- 패키지 모듈 설치
$ npm install <package>
-- 버전 명시하여 특정 모듈 설치
$ npm install <package>@1.0.0
-- pakage.json 파일에 정의된 의존성 패키지 모두 설치
$ npm install
전역 설치
-g
옵션을 추가한다.- OS의 특정 경로에 설치되며, OS마다 설치 경로가 다르다.
$ npm install -g <package>
$ npm install -g <package>@1.0.0
- 기본적으로
C:\Users\사용자\AppData\Roaming\npm\node_modules
에 설치된다. - 설치 위치는
npm config
명령어를 사용해서 변경할 수 있다.
제거
npm uninstall
명령어로 제거한다.
$ npm uninstall <package>
$ npm uninstall -g <package>
pakage.json의 중요 속성
npm은 pakage.json을 통해 Node.js의 패키지를 관리한다.
- name : 프로젝트(패키지)의 이름.
- version : 프로젝트 버전 (semantic versioning 규칙을 따름)
- dependencies : 의존성 패키지 정의. 실제 프로덕션 배포에도 필요한 패키지이다.
- devDependencies : dependencies와 마찬가지로 의존성 패키지이지만, 실제 프로덕션 배포에는 필요하지 않고 개발에 필요한 패키지만 정의.
- repository : 소스 코드가 저장된 리포지터리 주소.
- author : 개발자 정보.
- license : 라이선스.
- 여기에 라이선스의 특징이 잘 정리되어 있다.
- main : 패키지 설치하는 곳에서 진입점으로 사용할 파일
// pakage.json { "name" : "my-project", "version" : "1.0.0", "main" : "index.js" } // pakage.json의 main 속성에 정의된 index.js 파일 기준으로 모듈을 가져옴. import main from 'my-project';
- files : npm 레지스트리 배포 시, 포함해야 할 폴더나 파일을 정의
- files 속성이 있다면, 해당 속성에 정의된 파일들만 배포한다.
- types : 타입스크립트 사용 시, type 속성에 타입 정의 파일을 명시. (typing 속성 역시 동일)
🍳 devDependency와 dependencies npm install 명령어 뒤 -D 옵션 혹은 –save-dev를 추가하면 개발 환경에 사용될 패키지를 설치한다. 외부에서 특정 패키지 설치 시 dependencies는 함께 설치되지만 devDependencies는 설치되지 않는다.
의존성 버전과 semantic versioning
각기 다른 버전 방식을 따르는 소프트웨어, 패키지는 동일한 규칙으로 통합 관리하기 위해 등장
X.Y.Z의 양의 정수로 정의한다.
- X : Major 버전
- 프로젝트 전반적인 큰 구조 변경, 기존 API, 옵션과 호환되지 않는 변경 사항이 있을 경우.
- 사용자 측에 많은 변경을 요구하기 때문에 마이그레이션 가이드, 스크립트를 제공해주는 경우가 많음.
- Y : minor 버전
- 하위 버전과 호환되는 기능을 추가할 때
- Z : patch 버전
- 이전 버전과 호환되는 버그를 수정할 때
npm의 의존성 버전 관리
npm install 명령어를 사용하여 패키지 설치 시 pakage.json에 ^(캐럿) 표시와 함께 패키지 버전이 명시됨.
"dependencies": {
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-router-dom": "^5.3.0",
"react-scripts": "5.0.1",
},
캐럿
0이 아닌 버전 요소 중 가장 왼쪽에 있는 요소를 수정하지 않는 범위에서 패키지를 설치
ex ) pakage.json에 ^1.2.3 버전으로 정의된 패키지의 최신 버전이 1.3.0이면, 1.3.0 버전 설치. ^0.2.3으로 정의되어 있고 최신 버전이 0.3.0이면, 0.2.9 설치
💡 ~(틸드)를 사용하면 특정 버전으로 고정하거나 마이너 버전만 패치 버전만 업데이트 할 수 있다.
pakage-lock.json 파일의 중요성
pakage.json은 버전 범위를 사용하여 패키지를 설치하기 때문에 설치 시점마다 패키지 버전이 달라질 수 있음.
→ 버전 충돌이나, 프로젝트 개발자마다 다른 버전 패키지가 설치되어 동작 오류 발생할 가능성이 있음.
pakage-lock.json은 설치 시점 당시의 의존성 트리 정보를 저장하고 있으며, pakage-lock.json이 있다면 npm은 이 파일의 의존성 트리를 기준으로 패키지를 설치한다.