トップ «前の日記(2012/02/09 (木) ) 最新 次の日記(2012/02/11 (土) 建国記念の日)» 編集 RSS feed

HsbtDiary


2012/02/10 (金) [長年日記]

[rake] Rake で任意のタスクの前後に別のタスクを実行する

これどうやるんだろうと思って調べてみたら mrkn が rake-hooks というのを見つけていたので実際に使ってみたんだけど、delayed_job の after や before というメソッドと衝突するような作りだったりして使い物にならないので諦めた。

もう少し調べてみると Rake 本体にある Rake::Task#enhance を使うと実現できるらしい。使い方はこんな感じ。

task :mybefore do
  puts :foo
end

task :myafter do
  puts :bar
end

task :buzz do
  puts :buzz
end

Rake::Task[:buzz].enhance([:mybefore]) do
  Rake::Task[:myafter].invoke
end

実行結果はこんな感じ

$ rake buzz
foo
buzz
bar

ちょっと独特なDSLだけど、enhance の引数に事前に実行したいタスクのタスク名をArrayで渡して、ブロックに事後に実行したいタスク(というか処理)を追加する。rake spec を実行する前に db:migrate が実行されてなかったら実行するだとか、db:seed をした後に fixture を作り直すとかすると便利かもね。