npm run tsc
타입스크립트를 자바스크립트로 컴파일해주는 CLI(Command Line Interface)입니다. 간단한 명령어 하나만 입력하면 되어 굉장히 편리한데요. 최근 개인 프로젝트로 개발 생산성을 높여주는 라이브러리 하나를 만들고 있는 중, 모듈을 실행하기 위해 직접 node dist/main.js
처럼 경로를 직접 타이핑하는것이 사용자 입장에서 불편하다 판단되었습니다. 그래서 타입스크립트의 tsc
처럼 간단한 CLI를 만들어 실행의 편리함을 높이려 합니다.
실행원리 톺아보기
먼저 타입스크립트의 tsc
가 어떻게 실행되는지를 쫓아가며 이해해보겠습니다. 혹시 타입스크립트가 설치되어 있지 않다면 아래 명령어를 실행한 후 따라와주세요.
npm i typescript -D
npm run
먼저 npm run <명령어>
라는 명령어는 package.json
의 script
영역에 정의된 dev
, start
, build
와 같은 실행 스크립트들을 실행해주는 역할을 합니다. 그런데 스크립트 상에서는 tsc
로 정의된 스크립트가 보이지 않습니다. 그렇다면 npm run
은 무엇을 실행하게 되는걸까요?
bin
패키지들이 설치되어 있는 node_modules
디렉토리를 살펴보면 가장 위에 숨김 디렉토리인 .bin
디렉토리가 존재합니다. .bin
디렉토리 안을 살펴보면 tsc라는 파일을 확인할 수 있는데요. 아마 npm run tsc
이 파일을 실행할 것으로 추측해볼 수 있습니다.
여기에서 bin은 binary의 준말로 실행가능한 파일들이 존재하는 디렉토리입니다. 운영체제 단에서도 마찬가지로 bin 디렉토리 안에 실행가능한 바이 너리 파일들이 모여있으며, PATH 환경 변수가 bin 디렉토리를 참조해 실행하는데 이러한 동작방식과 동일합니다.
tsc
.bin
디렉토리 안에 존재하는 tsc를 열어보면 다음과 같이 간단한 코드가 들어있습니다.
#!/usr/bin/env node
require('../lib/tsc.js')
.bin
디렉토리 안의 tsc 파일은 실행 스크립트 형태로 되 어 있어 node 명령어를 쓰지 않아도 npm run으로 실행이 가능합니다. 그러나 실제로는 해당 스크립트가 node로 실행이 되어야 하기 때문에 첫 줄의 shebang(#!로 시작하는 첫줄)에 node로 해당 스크립트 파일을 실행하도록 표시하게 됩니다.
정확히 말하면 node_modules
의 .bin
안에 있는 이 파일은 심볼릭 링크로 실제 모듈이 들어있는 디렉토리의 bin 파일의 실행파일을 가리키고 있으며, npm run tsc는 실제 모듈의 스크립트를 실행합니다.
내 패키지의 명령어 만들기
원리도 크게 복잡하지 않기 때문에 역시 만드는 방법도 크게 어렵지 않습니다.
01. 실행파일 만들기
루트경로에 bin 디렉토리를 하나 만들고 그 안에 cli.js
를 생성합니다.(파일경로가 꼭 bin에 있어야하는 것은 아닙니다!) 여기에서는 실행할 파일이 루트경로에 있는 main.js
라고 가정하겠습니다.
cli.js
에 다음과 같은 실행코드를 작성합니다.
#!/usr/bin/env node
require('../main.js')
02. 명령어를 등록하기
이 예시에서는 example-nice
라는 명령어로 모듈을 실행하려고 합니다.
package.json의 bin 설정에 명령어와 1번의 실행파일 경로를 등록합니다.
"bin": {
"example-nice": "./bin/cli.js"
}
03. 빌드 및 배포하고 사용하기
이제 해당 프로젝트를 빌드하고 배포하고나면, npm install
로 설치시 node_modules
의 .bin
디렉토리안에 example-nice
라는 심볼릭 링크가 생성되어 있는 것을 확인할 수 있습니다.
이제 아래와 같이 나만의 명령어를 통해 원하는 파일을 실행할 수 있게 됩니다.
npm run example-nice