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


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


🍣 インストール手順

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

# command-line interfaces
gem 'thor'

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

gem install thor

🚌 基本的な使い方

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

#!/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

さっそく作成したコマンドを実行してみます!

# 初回のみ実行権限を付与
chmod a+x testest

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

🍮 引数とオプションの追加

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

#!/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

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

# -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の環境情報を使ったコマンドも簡単に作成できます。

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が欲しくなるかもです。そんな場合はこちら。

module Sinatra
class App < Thor
namespace :myapp
def install
# task code
end
# other tasks
end
end

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

thor myapp:install

🎳 Thor GitHub Wiki

ThorのGitHubのWikiはこちら!

Home erikhuda/thor Wiki - GitHub

🏀 参考リンク

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

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

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

🖥 VULTRおすすめ

VULTR」はVPSサーバのサービスです。日本にリージョンがあり、最安は512MBで2.5ドル/月($0.004/時間)で借りることができます。4GBメモリでも月20ドルです。 最近はVULTRのヘビーユーザーになので、「ここ」から会員登録してもらえるとサービス開発が捗ります!

📚 おすすめの書籍