Reemplazar las tareas predeterminadas de rake de los Rails

Tengo un proyecto de Rails 2.2 en el que quiero anular la funcionalidad de la tarea de rake db:test:prepare . Pensé que esto funcionaría, pero no es así:

 #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 

Obtengo el comportamiento de la tarea estándar. Si cambio el nombre de la tarea a :prepare2 y luego hago rake db:test:prepare2 , entonces funciona bien. La conclusión natural que saco de esto es que mis tareas de rake se están definiendo antes que las Rails integradas, por lo que el estándar omite lo mío :prepare tarea.

¿Alguien puede ver cómo puedo solucionar esto? Prefiero anularlo que tener que usar una nueva tarea. Gracias, max

Si define una tarea de rake que ya existe, su ejecución se anexa a la ejecución de la tarea original; ambas tareas serán ejecutadas.

Si quiere redefinir una tarea, primero debe borrar la tarea original:

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

También es útil tener en cuenta que una vez que una tarea se ha ejecutado en el rake, no se ejecutará nuevamente, incluso si la vuelve a llamar. Esto es por diseño, pero puede llamar a .reset en una tarea para permitir que se ejecute de nuevo.

Debe eliminar la tarea predeterminada antes de agregar la suya propia:

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

Un modismo bastante popular es crear un método de conveniencia llamado remove_task así:

 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 

( Fuente: drnic/newgem )

Cree un nuevo archivo project.rake en lib / tasks / y pegue debajo del código en él.

 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'] 

inspirado en el blog de Krasimir Angelov

Intentaba hacer lo mismo y encontré esto en codingspree.net http://j.mp/1ICZrm5