Подтвердить что ты не робот

Выполнение переопределения рейков по умолчанию

У меня есть проект 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.

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Перед добавлением собственного пользователя необходимо удалить задачу по умолчанию:

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)

Ответ 3

Создайте новый файл 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']

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

Ответ 4

Я пытался сделать то же самое и наткнулся на это на codingspree.net http://j.mp/1ICZrm5