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

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark