들어가며
node.js 프로젝트의 경우 package.json 파일의 scripts 항목에 프로젝트에서 필요한 주요 작업들을 스크립트로 만들어서 등록해 놓는 경우가 많다. 대부분의 경우엔 start 스크립트로 충분할 때가 많지만 그 외의 스크립트를 실행하고 싶을 때는 어떤 스크립트들이 있는지 확인하기 위해 package.json 파일을 열어봐야 하는 귀찮음이 있었다. 이런 귀찮음을 이겨내고자 점심 시간에 간단하게 아래와 같이 npm 스크립트를 쉽게 리스팅하고 실행하는 node.js 기반 프로그램을 하나 만들어 보았다. 만든 김에 node.js 로 CLI 만드는 방법에 대해서 간단히 정리해보려고 한다.
GitHub
https://github.com/eu81273/run-npm-scripts
npm
https://www.npmjs.com/package/run-npm-scripts
소스 코드
깃헙 레포에서 확인할 수 있지만, 소스 코드는 매우 단순하다.
package.json 파일을 가져와서 scripts 부분만 inquirer 로 리스팅해주고, 사용자가 선택을 하면 해당 스크립트를 child_process 의 spawn 으로 실행해주는 것이다. child process 의 입출력을 표시해주어야 하므로 stdio 는 inherit 로 설정해주었다.
또 커맨드 라인에서 실행해야 하므로 가장 위에 #!/usr/bin/env node
를 추가해준 것을 볼 수 있다. 첫 줄에 이 부분이 없으면 커맨드라인에서 실행할 수 없다.
#!/usr/bin/env node const co = require('co'); const fs = require('fs'); const { spawn } = require('child_process'); const inquirer = require('inquirer'); const chalk = require('chalk'); co(function* () { const packageData = fs.readFileSync('./package.json'); const { scripts = {} } = JSON.parse(packageData); const { target } = yield inquirer.prompt([{ type: 'list', name: 'target', message: 'Select npm script to run\n', choices: Object.keys(scripts) }]); const [ cmd, ...args ] = scripts[target].split(' '); spawn(cmd, args, { stdio: 'inherit' }); }) .catch(function () { console.log(chalk.blue('package.json'), 'not found.'); });
package.json
node.js 로 CLI 를 만들 때엔 package.json 파일에도 약간의 추가적인 설정이 필요하다.
{ ... "bin": { "rns": "./index.js" }, ... }
위와 같이 bin 이라는 항목을 추가하고 global 옵션으로 설치되었을 때 어떤 커맨드를 입력하면 이 애플리케이션이 실행될지를 지정해주어야 한다. 위의 예에서는 rns 라는 커맨드를 입력하면 이 패키지의 index.js 파일을 실행하도록 설정해두었다.
이제 npm 에 등록해주면 global 옵션으로 설치해서 사용할 수 있게 된다. 그런데 실제 npm 에 등록하기 전에 로컬에서 테스트도 필요한데, 이때엔 개발중인 패키지의 루트에서 단순하게 아래와 같이 입력해주면 현재 개발중인 패키지가 로컬에 global 로 설치되어 실제로 위에서 설정한 rns 라는 명령어로 이 패키지가 실행되는지 확인해볼 수 있다.
$ npm install -g
마치며
사실 오래전에 node.js 로 CLI 를 만드는 방법을 포스팅하려고 했는데, 미뤄두고 있다가, 혼자 사용할 간단한 CLI를 만든김에 소개할 겸 CLI 만드는 방법에 대해 써보았다.
요약해보면,
소스코드의 최상단에 #!/usr/bin/env node
를 추가해주는 것과,
package.json 에 bin 항목을 추가해주는 것,
그리고 로컬에서 테스트할 때는 해당 패키지 루트에서 npm install -g
명령으로 설치해서 테스트해볼 수 있다는 것
이렇게 세 가지로 압축할 수 있다.
여기에서는 inquirer 를 사용해서 인터렉티브하게 동작하도록 했는데, 이 외에도 commander 를 사용해서 실행 옵션 등을 받는 등 더 다양한 동작을 추가해줄 수 있다. 짧은 포스팅이지만 node.js 로 CLI 를 만드는 방법에 대해 조금이라도 이해하는데 도움이 되었기를 기대한다.