commander でサブコマンドを持つコマンドを ruby で作成する

commander を使ってサブコマンドを持つコマンドを ruby で作成したときのメモ。 なぜか、commander の日本語のページはあまりない。

インストール

gem install commander

テンプレートの作成

commander init test.rb

とすると test.rb が作成される。「Machine name of program」にはコマンド名を書く。 test.rb の中身は

#!/usr/bin/env ruby

require 'rubygems'
require 'commander/import'

program :version, '0.0.1'
program :description, 'test program'
 
command :sample-subcommand do |c|
  c.syntax = 'machine_name sample-subcommand [options]'
  c.summary = ''
  c.description = ''
  c.example 'description', 'command example'
  c.option '--some-switch', 'Some switch that does something'
  c.action do |args, options|
    # Do something or c.when_called Machine_name::Commands::Sample-subcommand
  end
end

のようになる。サブコマンドにハイフンを入れると少し修正が必要。

command :sample-subcommand do |c|

command "sample-subcommand" do |c|

のように変更すれば動く。 また、README にあるように空白が入るサブコマンドも設定できる。

command :"gem install" do |c|

コマンドのオプションの設定

  c.action do |args, options|
    # Do something or c.when_called Machine_name::Commands::Sample-subcommand
  end

の args に指定したオプションではないコマンドライン引数が入る。 オプション –some-swich を指定すると

options.some_switch

が true になる。オプション -b で文字列を取得するには

c.option '-b STR', String, 'Example of string'

のように optparse と同じような方法で設定できる。指定された値へのアクセスは

options.b

のようにする。

コマンドのオプションのデフォルト値

c.option '--sample-default STR', String, 'Example of default value'

というようなオプションのデフォルト値は

  c.action do |args, options|
    options.default(:sample_default => "Default value")
    
    # Do something or c.when_called Machine_name::Commands::Sample-subcommand
  end

のように指定する。options.default に渡すハッシュのキーはシンボルでないといけなかった(文字列ではうまくいかない)。

コマンドのグローバルオプション

すべてのサブコマンドで有効なオプションを指定するには global_option を使う。

global_option('--verbose') { $verbose = true }

Tags of current page

,