覆盖rails的默认rake任务

我有一个Rails 2.2项目,我想要覆盖rake db:test:prepare任务的function。 我认为这会工作,但它不会:

 #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任务是在内置的Rails 之前定义的,所以我的:prepare工作被标准所覆盖。

任何人都可以看到我如何解决这个问题? 我宁愿重写它,也不愿意使用新的任务。 谢谢,最高

如果你定义了一个已经存在的rake任务,它的执行会被追加到原来的任务执行中。 这两个任务将被执行。

如果要重新定义任务,则需要先清除原始任务:

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

注意到一旦一个任务在rake中被执行,即使再次调用它也不会再执行。 这是由devise,但你可以调用.reset任务,让它再次运行。

添加自己的内容之前,您必须先删除默认的任务:

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

一个相当stream行的习惯用法是创build一个名为remove_task的便捷方法, remove_task所示:

 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 

( 来源: drnic/newgem

lib / tasks /下创build一个新的project.rake文件,并在下面的代码中添加paster。

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

灵感来自Krasimir Angelov的博客

我试图做同样的事情,并在codingspree.net http://j.mp/1ICZrm5碰到这个;