ruby-on-rails - generators - rake rails
Reemplazar las tareas predeterminadas de rake de los rieles (4)
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
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
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
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.