패키지 안에는 .bin이라고하는 숨김 폴더가 존재한다. 이 폴더는 뭐때매 있는건지 궁금해서 찾아보았다.
.bin
이 폴더는 이름에서도 유추할수있다시피 바이너리 파일들이 저장되는 곳이다. (바이너리 파일이란 1과 0으로만 이루어진 파일이다.)
모듈을 npm install로 설치하고나서 node [방금 설치한 모듈] 를 입력해서 노드로 그 모듈을 실행 할 수도있지만, package.json에 scripts에 적힌 스크립트를 통해서 바로 모듈을 실행시킬수있다.
node명령어와 npm scripts의 차이
npm install을 통해 설치한 노드 모듈을 살펴보면 js 파일들로 가득하다. node라는것은 결국 자바스크립트 실행기이므로 node명령어로 이 node_modules아래에 있는 외부 모듈을 실행 시킬 수 있다.
또 다른 방법으로, npm scripts를 통해서 외부 모듈을 실행시킬 수 있다. 이 방법으로 모듈을 실행시킨다는것은 node_modules/.bin 폴더에 있는 실행파일을 직접 실행하는것이다. 실행파일은 0과 1로 구성된 바이너리 파일이므로 그 자체로 실행이 가능하다. node가 필요하지 않다.
예시
pm2라고 하는 모듈을 로컬로 설치해보자.(글로벌 설치 X )
pm2 index.js
이 pm2모듈은 index.js를 사용한다. 로컬 설치기 때문에 위 처럼 터미널에서 pm2모듈을 실행시키려고하면 에러가 난다. (운영체제 환경변수에 등록되지 않아서 운영체제가 해당 pm2 파일이 어디에 있는지 못찾는다.) package.json
의 scripts
부분에 다음과 같은 npm 스크립트를 적어주자.
"start" : "pm2 index.js"
이 pm2는 다음 두가지 방법으로 실행시킬 수 있다.
node node_modules/pm2/bin/pm2.js index.js
이 방법은 node를 통해서 자바스크립트 자체를 실행한것이고,
npm run start
이 방법은 npm install할때 nodemodules/.bin폴더에 생성된 pm2의 실행파일을 npm이 바로 실행시켜주는 방법이다. 즉 npm은 npm run start
라는 명령어가 입력되면 `nodemodules/.bin/pm2` 실행파일을 실행시킨다.
또다른 예시
예를 들어 다음과 같이 nodemon
을 설치했다고 해보자.
npm install nodemon
이때 다음과 같은 일들이 벌어진다.
- 모듈을
node_modules/nodemon
에 설치한다. - 모듈을 바이너리로 컴파일한다.
- 바이너리 파일을
node_modules/.bin
에 복사한다.
위에서 nodemon
을 -g 옵션으로 설치하지 않았기 때문에 터미널에서 nodemon
을 바로 사용할 수 없다. 하지만 npm script
를 통해서 nodemon
을 npm
이 대신 실행하게 해줄 수 있다 이때 nodemon
의 바이너리 파일이 실행된다.