【问题标题】:Overriding rails' default rake tasks覆盖 rails 的默认 rake 任务
【发布时间】:2011-12-28 01:33:05
【问题描述】:

我有一个 Rails 2.2 项目,我想在其中覆盖 rake db:test:prepare 任务的功能。我认为这会起作用,但它不起作用:

#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 任务覆盖。

谁能看到我如何解决这个问题?我宁愿覆盖它也不愿使用新任务。谢谢,马克斯

【问题讨论】:

  • 可以直接修改RAILS_ROOT中的Rakefile吗?

标签: ruby-on-rails rake


【解决方案1】:

如果你定义了一个已经存在的 rake 任务,它的执行会被附加到原始任务的执行中;两个任务都会被执行。

如果要重新定义一个任务需要先清除原来的任务:

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

还需要注意的是,一旦在 rake 中执行了任务,即使您再次调用它,它也不会再次执行。这是设计使然,但您可以在任务上调用 .reset 以允许它再次运行。

【讨论】:

  • 啊,看起来这也有效,而且语法更好。谢谢!
  • 别担心 :) 我想这可能是第一次有人接受我的回答! :D
  • 如果相关任务不存在(例如,如果您在生产与开发模式下运行),这可能会失败。要使其即使在任务不存在时也能正常工作,请先创建一个隐式空任务:task :default => []; Rake::Task[:default].clear
  • Rake::Task.clear Rake::Task['rake_task'].reenable Rake::Task['rake_task'].invoke 这样可以吗?
【解决方案2】:

您必须在添加自己的任务之前删除默认任务:

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

fairly popular idiom 是创建一个名为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

(Source: drnic/newgem)

【讨论】:

  • 谢谢亚历克斯,上面的对我来说很好,而且对于正在发生的事情也更明显,为了其他任何人看它。干杯
【解决方案3】:

lib/tasks/ 中创建一个新的 project.rake 文件,并将以下代码粘贴到其中。

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's blog

【讨论】:

    猜你喜欢
    • 2017-10-04
    • 2017-11-26
    • 2021-03-18
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 2016-09-16
    • 2013-05-12
    • 2019-04-13
    相关资源
    最近更新 更多