Rakeのタスククラスの作法
Rakeで同じパターンのタスクを繰り返すとき、メソッドでサブルーチン化してもタスク関連の記述(descとか)が冗長なのでいまいち感がぬぐえない。 のでタスククラスの書き方を調べた。
明文化されたルールが見つからなかったが、サンプルを見たりRakeのコードをちょっと調べてみたところ、たぶんこんな感じ。
Rake::TaskLib
クラスを継承する。このクラスでRakeのDSLを定義している。- オブジェクト作成のタイミングでタスクを定義する。具体的には
initialize
メソッドでdesc
やtask
を宣言する。
サンプルコード:
desc 'Test' task :test => [ :rbdptest, :rbcrtest, :rbvltest ] class QDBMTestTask < Rake::TaskLib def initialize(name, *args) @name = name @args = args define end def define desc "#{@name}test" task("#{@name}test") { run } CLOBBER.include "test/#{@name}casket" end private :define def run rm_rf "test/#{@name}casket" ruby "test/#{@name}test", 'write', "test/#{@name}casket", *@args ruby "test/#{@name}test", 'read', "test/#{@name}casket" ruby "test/#{@name}test", 'misc', "test/#{@name}casket" end private :run end QDBMTestTask.new('rbdp', '10000', '1000') QDBMTestTask.new('rbcr', '10000', '1000', '10') QDBMTestTask.new('rbvl', '10000')