我有一个Rails 2.2项目,我想在其中覆盖rake db:test:prepare任务的功能.我认为这会起作用,但它没有: #lib/tasks/db.rakenamespace :db do namespace :test do desc "Overridden version of rails' standard db:test:prep
#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之前被定义,因此我的标准被覆盖:准备任务.
任何人都可以看到我如何解决这个问题?我宁愿覆盖它而不是使用新任务.谢谢,最多
如果定义已存在的rake任务,则会将其执行附加到原始任务的执行中;这两项任务都将被执行.如果要重新定义任务,则需要先清除原始任务:
Rake::Task["db:test:prepare"].clear
注意一旦任务在rake中执行,即使再次调用它也不会再次执行,这也很有用.这是设计的,但您可以在任务上调用.reset以允许它再次运行.