酒と泪とRubyとRailsと

Ruby on Rails と Objective-C は酒の肴です!

Thor Rubyで簡単にshellコマンドが作れる!

この前作ったFacebookやTwitter、はてなブックマークのカウントを収集してくれるGem『scouter』のコマンドを作った際にお世話になった『erikhuda/thor』が思っていた以上に高機能だったので忘れないようにメモ記事です!


インストール手順

いつもどおりGemfileに以下を追加して、bundle installを実行してください。

1
2
# command-line interfaces
gem 'thor'

もしくはコマンドライン上で以下のコマンドを実行。

1
gem install thor

基本的な使い方

testestを作成して以下コードを記述します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/env ruby
#coding: utf-8
require 'rubygems'
require 'thor'

class Command < Thor
  default_command :example

  desc 'example', 'an example task'
  option :file, type: :string, aliases: '-f', desc: 'Delete the file after parsing it'
  def example
    puts "executing! argument is #{options[:file]}!"
  end
end

Command.start

早速作成したコマンドを実行してみます!

1
2
3
4
5
# 初回のみ実行権限を付与
chmod a+x testest

./testest -f sample.file
#=> executing! argument is sample.file!

引数とオプションの追加

先ほどのコマンドに引数と、オプションを足してみます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/env ruby
#coding: utf-8
require 'rubygems'
require 'thor'

class Command < Thor
  default_command :example

  desc 'example', 'an example task'
  option :file, type: :string, aliases: '-f', desc: 'Delete the file after parsing it'
  method_option :delete, aliases: '-d', desc: 'Delete the file after parsing it'
  def example
    if options[:delete]
      puts "executing! argument is #{options[:file]} and delete option is true!"
    else
      puts "executing! argument is #{options[:file]} and delete option is false!"
    end
  end
end

Command.start

では先ほど作ったコマンドを実行してみます。

1
2
3
4
5
6
7
# -d(--delete) オプションを付けない場合
./testest -f 'sample.file'
#=> executing! argument is sample.file and delete option is false!

# -d(--delete) オプションを付ける場合
./testest -f 'sample.file' -d
#=> executing! argument is sample.file and delete option is true!

Railsの環境情報を取得

Railsの環境情報を使ったコマンドも簡単に作成できます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Example < Thor
  include Thor::Actions
  desc "init_example", " you can write some description"
  method_options :force => :boolean, :aliases => "-f"
  def init_example
    # Railsの環境情報を読み込み
    require './config/environment'

    if options[:force]
      if yes?("WARN: Are u sure ?",:yellow)
        delete_sql = "truncate examples"
        say "delete all datas from examples ... ", :red
        ActiveRecord::Base.connection.execute(delete_sql)
      else
        say "Cancel!", :red
        return
      end
    end

    #TODO
  end
end

Namespaceを付け足す

thorを使いこなす過程でNamespaceが欲しくなるかもです。そんな場合はこちら。

1
2
3
4
5
6
7
8
9
module Sinatra
  class App < Thor
    namespace :myapp
    def install
      # task code
    end
    # other tasks
  end
end

ちなみに、実行コマンドは以下の通りです。

1
thor myapp:install

Thor GitHub Wiki

ThorのGitHubのWikiはこちら!

Home erikhuda/thor Wiki - GitHub

Special Thanks

Ruby - Thorの使い方まとめ - Qiita

Ruby で作る、簡単 CLI ツールのススメ - Qiita

Thorで簡単にコマンドラインアプリをつくる - Joy Luck Crab

おすすめの書籍