覆盖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碰到这个;