Rakeのタスククラスの作法

Rakeで同じパターンのタスクを繰り返すとき、メソッドでサブルーチン化してもタスク関連の記述(descとか)が冗長なのでいまいち感がぬぐえない。 のでタスククラスの書き方を調べた。

明文化されたルールが見つからなかったが、サンプルを見たりRakeのコードをちょっと調べてみたところ、たぶんこんな感じ。

  1. Rake::TaskLibクラスを継承する。このクラスでRakeのDSLを定義している。
  2. オブジェクト作成のタイミングでタスクを定義する。具体的にはinitializeメソッドでdesctaskを宣言する。

サンプルコード:

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')