1. ホーム
  2. ruby-on-rails

rails のデフォルトの rake タスクをオーバーライドする

2023-08-08 02:58:08

質問

Rails 2.2プロジェクトで、以下の機能をオーバーライドしたいのですが、どうすればよいでしょうか。 rake db:test:prepare タスクの機能を上書きしたいのです。 私はこれがうまくいくと思ったのですが、うまくいきません。

#lib/tasks/db.rake
namespace :db do
  namespace :test do
    desc "Overridden version of rails' standard db:test:prepare task since the schema dump used in that can't handle DB enums"  
    task :prepare => [:environment] do
      puts "doing db:structure:dump"
      Rake::Task['db:structure:dump'].invoke
      puts "doing db:test:clone_structure"
      Rake::Task['db:test:clone_structure'].invoke
    end   
  end
end

標準のタスクの挙動が出ますね。 もし、タスクの名前を :prepare2 にして、次に rake db:test:prepare2 を実行すると、正常に動作します。 ここから導き出される自然な結論は、私の rake タスクが以下のように定義されているということです。 の前に の前に定義されているため、私のタスクは標準の :prepare タスクで上書きされます。

誰かこれを修正する方法を見ることができますか? 私は新しいタスクを使用する必要があるよりも、それを上書きしたいです。 ありがとうございます、max

どのように解決するのですか?

既に存在する rake タスクを定義した場合、その実行は元のタスクの実行に追加されます; 両方のタスクが実行されます。

タスクを再定義したい場合は、最初に元のタスクをクリアする必要があります。

Rake::Task["db:test:prepare"].clear

また、rake で一度実行されたタスクは、再度呼び出したとしても二度と実行されないということも知っておくと便利です。これは意図的なものですが .reset を呼び出すことで再実行させることができます。