JavaScript

[Node.js] cli(command-line interface) 프로그램 생성하기(commander.js)

코딩하는 Jay 2021. 2. 18. 17:17
반응형

 회사에서 신규 프로그램에 사용할 데이터를 자동으로 가공하는 프로그램을 만들고 있습니다. Node 기반으로 프로그램을 작성하고 있는데, cli를 이용하여 입력 값을 받아 동작하도록 구현했습니다.

 

이를 구현하기 위해 commander.js를 사용했습니다. 제가 사용한 방법 위주로 정리해보도록 하겠습니다.

 

commander.js를 사용하기 위해서는 아래와 같이 패키지를 설치해야합니다.

$ npm install --save commander

 

Option

일반적인 Option을 정의합니다. 옵션의 데이터가 올 수 도 있고, 옵션만 사용할 수도 있습니다.

 

app.js 를 아래와 같이 작성합니다.

const { Command } = require('commander');

const program = new Command();

program
    .option('-n, --name <name>', 'file name')
    .option('-c, --compress', 'compress')
    .parse();

console.log(program.opts().n);
console.log(program.opts().name);
console.log(program.opts().compress);

 

작성이 완료되었으면 아래 명령어를 이용하여 테스트 해보도록겠습니다.

$ node app.js -n 'a.txt'
$ node app.js --name 'a.txt' -c

 

결과는 아래와 같습니다.

$ node app.js -n 'a.txt'
undefined
a.txt
undefined

$ node app.js --name 'a.txt'
undefined
a.txt
true

-n 또는 --name 으로 데이터를 입력 받을 수 있고, 내부에서 참조할 땐, name으로 참조해야합니다. option을 사용하고 데이터를 전달하지 않으면 true 값을 반환하게 됩니다.

 

이렇게 option을 정의했다면, -h, --help를 이용하여 help를 볼 수도 있습니다.

$ node app.js -h
Usage: app [options]

Options:
  -n, --name <name>  file name
  -c, --compress     compress
  -h, --help         display help for command

option 함수를 이용하여 정의한대로 잘 나오는 것을 확인할 수 있습니다.

 

Default Value

옵션에 사용할 기본 값도 정의할 수 있습니다. 해당 옵션을 사용하지 않으면 기본 값으로 할당되게 됩니다.

options 메서드의 세번째 인자로 기본 값을 설정합니다. name의 기본값은 'default file name'으로 compress의 기본값은 false로 설정했습니다.

const { Command } = require('commander');

const program = new Command();

program
    .option('-n, --name <name>', 'file name', 'default file name')
    .option('-c, --compress', 'compress', false)
    .parse();

console.log(program.opts().name);
console.log(program.opts().compress);

그럼 실행해보겠습니다.

$ node app.js
default file name
false

옵션을 지정하지 않았지만 문제없이 출력되는 것을 확인할 수 있습니다.

 

Required option

필수 옵션을 지정할 수 있습니다. name을 필수 옵션으로 지정해보도록 하겠습니다. option 메서드 대신 requiredOption 메서드를 사용하면 됩니다. 기본값도 제거 했습니다.

const { Command } = require('commander');

const program = new Command();

program
    .requiredOption('-n, --name <name>', 'file name')
    .option('-c, --compress', 'compress', false)
    .parse();

console.log(program.opts().name);
console.log(program.opts().compress);

실행 결과는 아래와 같습니다.

$ node app.js
error: required option '-n, --name <name>' not specified

name 옵션이 입력되지 않아 error를 발생시키며 프로그램이 종료된 것을 확인할 수 있습니다.

 

Version

마지막으로 프로그램의 버전을 확인하는 version 메서드를 추가해보겠습니다. 저는 package.json에 있는 옵션을 사용하여 출력했습니다.

const { Command } = require('commander');
const packageJson = require('./package.json');

const program = new Command();

program
    .requiredOption('-n, --name <name>', 'file name')
    .option('-c, --compress', 'compress', false)
    .version(packageJson.version)
    .parse();

console.log(program.opts().name);
console.log(program.opts().compress);

버전을 출력하기 위해 -V 혹은 --version 옵션을 사용할 수 있습니다.

$ node app.js --version
1.0.0

잘 출력된 것을 확인 할 수 있습니다.

 

 

소스는 아래 링크에서 확인 가능합니다.

 

 

hjleesm/commanderTest

Contribute to hjleesm/commanderTest development by creating an account on GitHub.

github.com

 

반응형