無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

Rakeの基本的な使い方まとめ

Rakeの基本的な使い方のまとめです。

  • インストールから、Rakefileの書き方、組み込みライブラリの使い方まで。
  • 忘れたときに見返す用に。

Rakeって何?

rubyで処理内容を定義できるビルドツール。「xmlでなくrubybuild.xmlを書くAnt」ですな。

  • ruby専用とかいうわけではなく、javaのビルドなんかにも(使おうと思えば)使えます。
  • 処理内容をrubyで書けるので、ループとか条件分岐も思いのまま。
    • ただし、組み込みのタスクはちょい少ないので、ちょっとした作業させるにもコーディングが必要そうかな・・・。便利なライブラリがどっかにあったりするのかもですが・・・。

rakeツールのインストールと使い方

インストール

rubyrubygems は事前にインストールされている前提で。

$ gem install rake

rakeのgemをインストールするとrakeコマンドが使えるようになります。

rakeコマンド

よく使いそうなものをいくつか。

$ rake <タスク名> # 指定のタスクを実行。
$ rake <パラメータキー>=<値> <タスク名> # パラメータ指定ありで、指定のタスクを実行。
$ rake -h # 使い方を表示。
$ rake -T # 定義されているタスク一覧を表示
Rakefile

rakeが実行する処理内容(タスク)を定義するファイルです。rakeコマンドの引数でファイル名を指定できるので、任意の名前をつけても問題ないですが、デフォルトは「Rakefile」なのでそれに合わせておくとちょい楽。

Rakefileの書き方

Task

Rakeで行う処理は「タスク」としてRakefileで定義されます。タスクは以下の要素から成ります。

  • 名前
    • タスクを識別するための名前。rakeコマンドで実行するタスクを指定する場合などに使用します。
  • アクション
    • タスクで行われる一連の処理です。省略可です。
  • 事前タスク
    • 前提として実行するタスクの一覧です。指定された事前タスクは、タスクの実行前に実行されていなければ実行されます。
  • パラメータ
    • タスクに渡されるパラメータ名です。rakeコマンドの引数で

タスクは「task」メソッドで定義できます。

## 書き方
# task <タスク名> , [<パラメータ名>, <パラメータ名> ... ] => [<前提タスク名>,<前提タスク名> ... ] do
#    # アクション
# end

# "hello" を表示するだけのタスク
task :hello do
  puts 'hello'
end

# "hello"の後に"world"を出力するタスク
task :hellow_world=>[:hello] do
  puts 'world'
end

# アクションなしのタスク
task :all=>[:hellow_world, :echo]

#パラメータを受け付けるタスク
task :echo, [:message] => [:hello] do |t, args|
  # ブロックへのパラメータとしてタスクオブジェクトとパラメータが渡される。
  puts args.message
end

タスクに説明を付ける

「desc」で、次に作成するタスクの説明を設定できます。

desc "タスクの説明です。"
task :hoge

説明を付与しておくと、「-T」オプションの一覧で表示されます。

$ rake -T
(in xx/Rakefile)
rake hoge  # タスクの説明です。

指定のファイル/ディレクトリがあれば実行しないタスクを作る

「file」メソッドでタスクを定義すると、タスク名が示すファイルが存在しない場合のみ実行するタスク(File Task)を作成できます。「.classを作ったら消されるまで再コンパイルしない」といった場合に使えます。

# foo.txtがない場合のみ実行されるタスク
file "foo.txt" do
  puts "create foo.txt"
  open("./foo.txt", "w"){|f| f << "test." }
end

同様に、ディレクトリがない場合のみ作成するタスクも作成できます。こちらはアクションは指定できません。

# var/hoge ディレクトリがない場合のみ、ディレクトリを作るタスク。
# アクションは指定できない。
directory "var/hoge"

名前に対応するタスクが存在しない場合のタスクを指定する

「rule」メソッドで、名前に対応するタスクが存在しない場合に実行されるタスクを定義できます。

# *.txtが存在しない場合、作成するタスク
rule /.*\.txt/ do |t|
  puts "create #{t.name}"
  open("#{t.name}", "w"){|f| f << "test." }
end

rubyの「method_missing」的な機能ですかね。ただ、ruleで定義したタスクはFile Task扱い(=タスク名が示すファイルが存在しない場合のみ実行される)のでご注意。

名前空間

「namespace」で、任意の名前空間の中にタスクを定義できます。

# ネームスペースの中にタスクを定義する。
namespace :test do
  task :hello do
    puts 'hello'
  end
  task :hello_world=>[:hello] do
    puts 'world'
  end
end

タスクをグループ化したいときに。実行時には「<ネームスペース>:<タスク名>」の形式で指定します。

$ rake test:hello_world
(in xx/Rakefile)
hello
world

組み込みタスクを使う

よく使うタスクがいくつか組み込みで用意されていて、さくっと使えるようになっています。

成果物を削除する

clean/clobberタスクは

require 'rake/clean'

で定義されるタスクです。

  • clean
    • Remove any temporary products. (ビルドの一時作成物を削除する?)
    • デフォルトでは["**/*~", "**/*.bak", "**/core"]を削除するので、他に消したいものがあれば、定数「CLEAN」に追加します。
require 'rake/clean'
CLEAN << "*.txt"
  • clobber
    • Remove any generated file.(ビルドの作成物を削除する?)
    • cleanで消されるファイル+定数「CLOBBER」のファイルを削除します。
    • cleanとの違いはいまいちわからん。
rdocを作る

RDocTaskでrdocを生成するタスクをさくっと定義できます。

# 「lib/**/*.rb」のrdocを生成するタスク
require 'rake/rdoctask'
Rake::RDocTask.new do |rd| # RDocTask 内で rdoc,rdoc_clobber,rerdocが定義される。
  rd.rdoc_dir = 'rdocs'
  rd.rdoc_files = FileList["lib/**/*.rb"]
  rd.options << '-charset=UTF-8 '
end

これで、

$ rake -T
(in xx/Rakefile)
rake clobber_rdoc  # Remove rdoc products
rake rdoc          # Build the rdoc HTML Files
rake rerdoc        # Force a rebuild of the RDOC files

が定義され、実行できるようになります。

$ rake rdoc
(in xx/Rakefile)
rm -r rdocs

                            test.rb: c....
Generating HTML...

Files:   1
Classes: 1
Modules: 0
Methods: 4
Elapsed: 0.717s
Gemを作る、UnitTestを実行する .. etc ..

その他、未確認ですが、gemを作ったりUnitTestを実行したりするタスクもrdocのようなユーティリティでさくっと定義できるみたいです。詳細はrdocで。

補足: 参考にしたサイトなど