Thorの使い方まとめ

  • 217
    Like
  • 0
    Comment
More than 1 year has passed since last update.

コマンドラインツール作成支援のライブラリThorについて調べました。基本的な使い方について情報をまとめました。といっても、ほとんどホームページの基本情報を日本語訳しただけのようなものですが。

Thorの概要

Thorは、コマンドラインツールの作成を支援するライブラリです。
gitやbundlerのようにサブコマンドを含むコマンドラインツールを簡単に作成することができます。


基本的な使い方

Thorを継承したクラスのパブリックメソッドがコマンドになります。
MyCLI.start(ARGV)でコマンドラインの処理をスタートします。一般的にはbinフォルダの実行形式ファイル内でstart(ARGV)を実行します。

cli
class MyCLI < Thor
  desc "hello NAME", "say hello to NAME"
  def hello(name)
    puts "Hello #{name}"
  end
end

MyCLI.start(ARGV)

これでhelloに引数を渡すと挨拶を返すコマンドラインの出来上がりです。

$ ruby ./cli hello "ruby"
Hello ruby

また、Thorは自動的にヘルプも生成してくれます。コマンドの指定なしで実行するとヘルプを表示します。

$ ruby ./cli

Tasks:
  cli hello NAME # say hello to NAME
  cli help [TASK] # Describe available tasks or one specific task

Rubyの通常のメソッドと同じように、引数の初期値を指定することも可能です。初期値を指定すると該当の引数の入力は任意になります。

cli
class MyCLI < Thor
  desc "hello NAME", "say hello to NAME"
  def hello(name="Ruby")
    puts "Hello #{name}"
  end
end

引数を入力しない場合は初期値が使用されます。

$ ruby ./cli hello
Hello ruby

オプションの指定方法

コマンドのメタ情報としてオプションを指定することができます。

cli
class MyCLI < Thor
  desc "hello NAME", "say hello to NAME"
  option :from
  def hello(name)
    puts "from: #{options[:from]}" if options[:from]
    puts "Hello #{name}"
  end
end

オプションの値には、optionsハッシュにオプション名を指定することでアクセスできます。
オプションの値のデフォルトはStringですが、:typeを指定することで他のタイプを指定することができます。
:required => trueを指定することで特定のオプションを必須にすることができます。

cli
class MyCLI < Thor
  option :from, :required => true
  option :yell, :type => :boolean
  desc "hello NAME", "say hello toNAME"
  def hello(name="Ruby")
    output = []
    output << "from: #{options[:from]}" if options[:from]
    output << "Hello #{name}"
    output = output.join("\n")
    puts options[:yell] ? output.upcase : output
  end
end

オプションに対して指定できるメタ情報は以下の通りです。

  • :desc - オプションの説明。コマンドのヘルプに表示される。
  • :banner - オプションの説明。
  • :required - 必須。
  • :default - オプションのデフォルト値。:requiredと:defaultを同時に指定することはできない。
  • :type - オプションの値のタイプ。:string, :hash, :array, :numeric, :boolean
  • :aliases - オプションの別名。一般的にはオプションのショートバージョン指定のために使う。

:typeの指定には「オプション => タイプ」の省略表記を使用することができます。タイプには:requiredを指定することができます。この場合、そのオプションは:stringで必須になります。

クラス全体で共通のオプションをclass_optionで指定することができます。

cli
class MyCLI < Thor
  class_option :verbose, :type => :boolean

  desc "hello NAME", "say hello to NAME"
  options :from => :required, :yell => :boolean
  def hello(name)
    puts "> saying hello" if options[:verbose]
    output = []
    output << "from: #{options[:from]}" if options[:from]
    output << "Hello #{name}"
    output = output.join("\n")
    puts options[:yell] ? output.upcase : output
    puts "> done saying hello" if options[:verbose]
  end

  desc "goodbye", "say goodbye to the world"
  def goodbye
    puts "> saying goodbye" if options[:verbose]
    puts "goodbye world"
    puts "> done saying goodbye" if options[:verbose]
  end
end

参考