JavaScriptNode.js

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 cloudfront-tools@1.0.0 No description
npm WARN cloudfront-tools@1.0.0 No repository field.

+ commander@2.15.1
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'のようにハンドリングしてやることでデフォルト値を入れることもできそうです。

ブックマークや限定記事(予定)など

WP Kyotoサポーター募集中

WordPressやフロントエンドアプリのホスティング、Algolia・AWSなどのサービス利用料を支援する「WP Kyotoサポーター」を募集しています。
月額または年額の有料プランを契約すると、ブックマーク機能などのサポーター限定機能がご利用いただけます。

14日間のトライアルも用意しておりますので、「このサイトよく見るな」という方はぜひご検討ください。

広告ここから
広告ここまで

Related Category posts