commanderでNode.jsのCLIツールを作る
CLIコマンドが欲しくなる時が定期的にあるので、いい感じに作ってくれるライブラリとして「commander.js」を試してみました。 インストール Hello World的なものを作る まずはメッセージを出すだけのところ […]
目次
CLIコマンドが欲しくなる時が定期的にあるので、いい感じに作ってくれるライブラリとして「commander.js」を試してみました。
インストール
$ npm init -y
$ npm i -S commander
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN [email protected] No description
npm WARN [email protected] No repository field.
+ [email protected]
added 1 package in 1.05s
Hello World的なものを作る
まずはメッセージを出すだけのところから始めてみます。
実行ファイルの用意
JSファイルを用意します。直接実行できるように、chmod
しておきましょう。
$ touch cli.js
$ chmod +x cli.js
Hello World的なコード
最低限のコードだと、以下のようになります。
#!/usr/bin/env node
/**
* Module dependencies.
*/
const program = require('commander')
program
.version('0.0.1', '-v, --version')
.parse(process.argv)
console.log('Hello CLI')
実行結果
シンプルな実装でしたが、これだけで-h / --help
と-v / --version
というユーザー的にはマストで欲しい2オプションがついてきます。
$ ./cli.js
Hello CLI
$ ./cli.js -v
0.0.1
$ ./cli.js -h
Usage: cli [options]
Options:
-v, --version output the version number
-h, --help output usage information
コマンドを追加する
実際にツールにするときは、./cli.js run {hoge}
のようにコマンドや引数を使うことがほとんどです。ということでコマンドを追加しましょう。
#!/usr/bin/env node
/**
* Module dependencies.
*/
const program = require('commander')
// バージョン情報
program
.version('0.0.1', '-v, --version')
// hogeコマンド
program.command('hoge')
.description('my first example')
.action(() => console.log('run hoge command'))
// fugaコマンド
program.command('fuga')
.description('2つ目のコマンドです')
.action(() => console.log('fugaが実行されました'))
program.parse(process.argv)
programに都度.command('COMMAND_NAME').action(FUNCTION)
していくイメージですね。もちろん追加したものは-h
で確認できます。
$ ./cli.js -h
Usage: cli [options] [command]
Options:
-v, --version output the version number
-h, --help output usage information
Commands:
hoge my first example
fuga 2つ目のコマンドです
オプションを追加する
最後にいろいろコマンドとして欲しくなるオプションを追加してみました。
#!/usr/bin/env node
/**
* Module dependencies.
*/
const program = require('commander')
// バージョン情報
program
.version('0.0.1', '-v, --version')
program
.command('exec <cmd>')
.alias('ex')
.description('execute the given remote cmd')
.option("-e, --exec_mode <mode>", "Which exec mode to use")
.action((cmd, options) => {
const mode = options.exec_mode || 'default'
console.log('exec "%s" using %s mode', cmd, mode)
}).on('--help', function() {
console.log(' Examples:')
console.log()
console.log(' $ deploy exec sequential')
console.log(' $ deploy exec async')
console.log()
})
program.parse(process.argv)
helpでみると、以下のようになります。
$ ./cli.js -h
Usage: cli [options] [command]
Options:
-v, --version output the version number
-h, --help output usage information
Commands:
exec|ex [options] <cmd> execute the given remote cmd
$ ./cli.js ex -h
Usage: exec|ex [options] <cmd>
execute the given remote cmd
Options:
-e, --exec_mode <mode> Which exec mode to use
-h, --help output usage information
Examples:
$ deploy exec sequential
$ deploy exec async
alias()
でexec
だけでなくex
などでも実行できるようにしています。--
から始まるオプションは.option(OPTION_NAME, DESCRIPTION)
で設定。.on('--help', FUNCTION)
でhelpの表示内容を定義しています。
optionの値は、action
の第二引数にオブジェクトで入って来る様子です。なので、const mode = options.exec_mode || 'default'
のようにハンドリングしてやることでデフォルト値を入れることもできそうです。