node.js

[node.js] package.json script 실행 파일 명령어 설정 ( --global )

판교너굴맨 2022. 6. 24. 15:08

1. 개요

이전에 nodemon 라이브러리를 사용하면서 한 가지 의문이 들었다.

우리는 nodemon과 eslint와 같은 라이브러리를 사용할 때 npm과 yarn과 같은 패키지 관리자로 실행할 수 있도록 package.json script에 설치한 라이브러리를 설정해왔다.

 

그럼 우리는 왜 script에 명령어를 설정해 왔던 걸까? 명령어를 짧게 쓰려고??

2. 실행 경로의 차이

nodemon을 예로 간단한 테스트를 해보겠다.

먼저 nodemon을 package.json이 있는 경로에서 설치 해본다.

npm i nodemon

이제 터미널에서 nodemon을 실행해보자!

nodemon app.js

나는 방금 nodemon을 설치했는데 nodemon 파일을 찾을 수 없다는 에러 메시지가 출력된다.

에러 메시지의 경로를 보면 /url/local/bin/에서 nodemon을 찾는 걸 알 수 있다.

패키지 관리자 (npm, yarn)는 라이브러리를 설치할 때 --global 옵션을 주지 않으면 기본적으로./node_modules에 라이브러리를 설치한다

./node_modules는 PATH로 설정이 되어 있지 않기 때문에 nodemon 실행 파일을 찾을 수 없던 것이다.

 

그럼 이번에는 nodemon 명령어를 package.json script에 설정하고 실행해보자!

  "scripts": {
    "dev": "nodemon app.js",
  },

위에서와 다르게 정상적으로 nodemon이 실행되는 걸 확인할 수 있다.

우리는 여기서 패키지 관리자로 실행한 명령어는./node_modules를 먼저 참조한다는 것을 유추할 수 있다.

 

경로를 확실히 알기 위해서 특정 명령어의 위치를 찾아주는 which 명령어를 사용해보자!

먼저 nodemon을 --global 옵션으로 이전 버전을 설치해서 테스트한다.

npm --global i nodemon@2.0.16

which nodemon

어라 아까 nodemon을 찾을 수 없다던 /url/local/bin/ 디렉터리에 nodemon이 설치된 걸 확인할 수 있다.

 

nodemon을 터미널에서 직접 실행하면 글로벌 명령어로 설치한 2.0.16 버전이 실행되었다.

 

그러면 로컬로 설치한 nodemon은 ./node_modules에 잘 설치되었는지 확인해 보자!

which 명령어는 설정된 PATH를 조회하기 때문에 ./node_modules를 조회하기 위해서는 package.json script에 설정해줄 필요가 있다.

  "scripts": {
    "dev": "nodemon app.js",
    "which": "which nodemon"
  },

명령어를 실행하면 ./node_modules에 nodemon이 설치되어 있는 걸 확인할 수 있다.

 

패키지 관리자로 실행한 명령어는 22.06.24 기준 최신 버전인 2.0.18 버전으로 실행된 걸 확인할 수 있다.

 

3. 결론

package.json script에 명령어를 설정하는 이유는 로컬로 ./node_modules에 설치된 실행 파일을 실행할 수 있도록 하기 위함이다.

 

지금까지 그냥 짧은 명령어로 실행하려고 설정하는 줄만 알았던 지난날의 나를 반성한다...