본문 바로가기

Programming/Node.js

6. 패키지 매니저 (1) - npm [4]

node js logo image

 

 

 

 

앞서서 간단히 npm 모듈을 설치해 보았는데, 이번에는 모듈 여러개를 동시에 설치해 보겠습니다. npm install [패키지1] [패키지2] [...] 형태로 실행할 수 있습니다. 

 

C:\>npm install morgan cookie-parser express-session

added 11 packages, and audited 76 packages in 5s

12 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

 

 

위와 같이 설치한 후, package.json을 살펴보겠습니다. dependencies에 설치한 패키지들의 속성이 추가로 기록된 것을 확인할 수 있습니다. 

 

{
  "name": "npmtest",
  "version": "0.0.1",
  "description": "hello package.json",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "johndoe",
  "license": "ISC",
  "dependencies": {
    "cookie-parser": "^1.4.6",
    "express": "^4.19.2",
    "express-session": "^1.18.0",
    "morgan": "^1.10.0"
  }
}

 

 

 


 

 

 

개발용 패키지 설치 방법도 별도로 존재합니다. 이는 실제 배포 시점에는 사용되지 않으면서 개발 중에만 사용되는 패키지를 의미하죠. npm instawll --save-dev [패키지] [...]로 설치하게 됩니다.

 

예제에서 이어서 nodemon을 설치합니다(소스가 바뀔 때마다 자동으로 노드를 재실행).

 

 

C:\>npm install --save-dev nodemon

added 29 packages, and audited 105 packages in 5s

16 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

 

 

package.json을 다시 살펴보면, devDependencies가 추가로 생성된 것을 확인할 수 있습니다. 

 

{
  "name": "npmtest",
  "version": "0.0.1",
  "description": "hello package.json",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "johndoe",
  "license": "ISC",
  "dependencies": {
    "cookie-parser": "^1.4.6",
    "express": "^4.19.2",
    "express-session": "^1.18.0",
    "morgan": "^1.10.0"
  },
  "devDependencies": {
    "nodemon": "^3.1.4"
  }
}

 

 


 

 

 

○ peerDependencies

 

참고로 peerDependencies가 존재하기도 합니다. 만일 특정 A라는 라이브러리의 package.json에 peerDependencies 속성에 "jQuery": "^3.0.0"이라고 할당되어 있다면, 어떤 뜻일까요?

 

이는 A라는 라이브러리가 jQuery 3 버전을 직접적으로 import / require해서 사용하지는 않지만, jQuery 3 버전이 설치된 것을 가정하고 코드가 작성되었다는 의미입니다. 그래서 실제로 jQuery 3가 설치되어 있지 않거나, 버전이 다를 경우 에러가 발생하게 됩니다. 

 

일반적으로 버전이 다르면 ERESOLVE unable to resolve dependency tree 에러가 표시됩니다. 당연히 버전을 맞춰서 설치하면 해결되지만, 여러 개의 패키지가 각각 동일한 모듈의 다른 버전을 요구하게 되면 문제는 골치아파집니다. 

 

이럴 때 npm i --force로 강제로 모든 버전을 설치하는 방법 또는 npm i --legacy-peer-deps로 peerDependencies를 무시하는 방법도 있습니다. 물론 최선은 충돌하지 않도록 패키지를 설치하는 것입니다.