既存のRakeタスクと同名のRakeタスクを定義した場合、上書きではなく連続実行になります。確か。

Railsでフレームワーク側で定義されているRakeタスクが30ほどありますが、それに含まれるタスクを少しカスタムして実行したいような場合に、lib/tasks以下にrakeタスクを追加するだけでは既存のタスクも動いてしまいます。

例えばlib/tasks/db_migrate.rakeとかいうファイルを用意して、次のようなコードを書いたとします。

1namespace :db do
2  desc "puts hoge"
3  task :migrate do
4    p "hoge"
5  end
6end

rake -Tでタスクを一覧してみると、次のように表示されます。

rake db:migrate                         # Migrate the database (options: VERSION=x, VERBOSE=false, SCOPE=blog) / puts hoge

やはり既存のタスクも一緒に動いてしまうようです。既存のタスクは動かしたくない場合はどうすればいいか。そのためには最初に既存のタスクを削除する必要があります。

1Rake.application.instance_variable_get('@tasks').delete('db:migrate')
2
3namespace :db do
4  desc "puts hoge"
5  task :migrate do
6    p "hoge"
7  end
8end

するとこのようになりました。

rake db:migrate                         # puts hoge

これで大体OKです。

ところでrake routesrake statsなどの一部のタスクはlib/task/*.rakeが読み込まれたあとで定義されるためこの方法では削除できません。rake routesなどを再定義する方法は今調べているところです。