既存のRakeタスクと同名のRakeタスクを定義した場合、上書きではなく連続実行になります。確か。
Railsでフレームワーク側で定義されているRakeタスクが30ほどありますが、それに含まれるタスクを少しカスタムして実行したいような場合に、lib/tasks
以下にrakeタスクを追加するだけでは既存のタスクも動いてしまいます。
例えばlib/tasks/db_migrate.rake
とかいうファイルを用意して、次のようなコードを書いたとします。
namespace :db do
desc "puts hoge"
task :migrate do
p "hoge"
end
end
rake -T
でタスクを一覧してみると、次のように表示されます。
rake db:migrate # Migrate the database (options: VERSION=x, VERBOSE=false, SCOPE=blog) / puts hoge
やはり既存のタスクも一緒に動いてしまうようです。既存のタスクは動かしたくない場合はどうすればいいか。そのためには最初に既存のタスクを削除する必要があります。
Rake.application.instance_variable_get('@tasks').delete('db:migrate')
namespace :db do
desc "puts hoge"
task :migrate do
p "hoge"
end
end
するとこのようになりました。
rake db:migrate # puts hoge
これで大体OKです。
ところでrake routes
やrake stats
などの一部のタスクはlib/task/*.rake
が読み込まれたあとで定義されるためこの方法では削除できません。rake routes
などを再定義する方法は今調べているところです。