Remplacement des tâches de râteau par défaut des rails

J’ai un projet Rails 2.2 dans lequel je veux remplacer la fonctionnalité de la tâche rake db:test:prepare . Je pensais que cela fonctionnerait, mais ce n’est pas le cas:

 #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 

J’obtiens le comportement de la tâche standard. Si je change le nom de la tâche en :prepare2 puis rake db:test:prepare2 , alors ça marche bien. La conclusion naturelle que j’en tire est que mes tâches de râteau sont définies avant celles de Rails intégrées, donc la norme est remplacée par la tâche standard :prepare tâche.

Quelqu’un peut-il voir comment je peux résoudre ce problème? Je préfère la remplacer que de devoir utiliser une nouvelle tâche. Merci, max

Si vous définissez une tâche de rake qui existe déjà, son exécution est ajoutée à l’exécution de la tâche d’origine; les deux tâches seront exécutées.

Si vous souhaitez redéfinir une tâche, vous devez d’abord effacer la tâche d’origine:

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

Il est également utile de noter qu’une fois une tâche exécutée, elle ne sera plus exécutée même si vous l’appelez à nouveau. C’est par conception, mais vous pouvez appeler .reset sur une tâche pour permettre son réexécution.

Vous devez supprimer la tâche par défaut avant d’append les vôtres:

 Rake.application.instance_variable_get('@tasks').delete('db:test:prepare') namespace 'db' do namespace 'test' do task 'prepare' do # ... end end end 

Un idiome assez populaire consiste à créer une méthode pratique appelée remove_task comme ceci:

 Rake::TaskManager.class_eval do def remove_task(task_name) @tasks.delete(task_name.to_s) end end def remove_task(task_name) Rake.application.remove_task(task_name) end 

( Source: drnic/newgem )

Créez un nouveau fichier project.rake à lib / tasks / et insérez le code ci-dessous.

 namespace :mv do desc "Display hint and info for your rails 4 project" task info: :environment do puts 'Run rake test to test' end end task(:default).clear.enhance ['mv:info'] 

inspiré par le blog de Krasimir Angelov

J’essayais de faire la même chose et je suis tombé sur ceci à codingspree.net http://j.mp/1ICZrm5