Переопределение рейка по умолчанию - PullRequest
69 голосов
/ 13 ноября 2011

У меня есть проект 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, тогда она будет работать нормально.Естественный вывод, который я могу сделать из этого, состоит в том, что мои задачи по рейку определяются до встроенных в Rails, поэтому моя задача отменяется стандартной задачей :prepare.

Может кто-нибудь увидетькак я могу это исправить?Я предпочел бы переопределить это, чем использовать новое задание.Спасибо, макс

Ответы [ 3 ]

119 голосов
/ 14 ноября 2011

Если вы определили задачу rake, которая уже существует, ее выполнение добавляется к выполнению исходной задачи;обе задачи будут выполнены.

Если вы хотите переопределить задачу, вам необходимо сначала очистить исходную задачу:

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

Также полезно отметить, что после выполнения задачи вРейк, он не будет выполняться снова, даже если вы позвоните снова.Это сделано специально, но вы можете вызвать .reset для задачи, чтобы снова запустить ее.

11 голосов
/ 13 ноября 2011

Вы должны удалить задачу по умолчанию перед добавлением своей собственной:

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

A довольно популярная идиома - создать вспомогательный метод с именем 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)

6 голосов
/ 18 мая 2013

Создайте новый project.rake файл в lib / tasks / и вставьте в него код ниже.

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

вдохновлено блогом Красимира Ангелова

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...