Заміна типових завдань рейків за замовчуванням


74

У мене є проект 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завдання.

Хтось може побачити, як я можу це виправити? Я вважаю за краще його перевизначити, ніж використовувати нове завдання. Дякую, макс


Можливо, ви можете безпосередньо змінити Rakefile у RAILS_ROOT?
Санта Чжан

Відповіді:


127

Якщо ви визначите завдання, яке вже існує, його виконання додається до виконання оригінального завдання; обидва завдання будуть виконані.

Якщо ви хочете перевизначити завдання, спочатку потрібно очистити початкове завдання:

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

Корисно також зауважити, що після того, як завдання було виконано за допомогою rake, воно не буде виконуватися знову, навіть якщо ви його знову викликаєте. Це за задумом, але ви можете викликати .resetзавдання, щоб дозволити його повторно запустити.


Ах, схоже, це теж працює, і це набагато приємніший синтаксис. Дякую!
Макс Вільямс

1
Не хвилюйтеся :) Я думаю, що це може бути вперше, коли хтось прийняв мою відповідь! : D
Brendon Muir

12
Це може не вдатися, якщо розглянуте завдання не існує (наприклад, якщо ви працюєте в режимі виробництва проти розробки). Щоб воно працювало навіть тоді, коли завдання не існує, спочатку створіть неявне порожнє завдання:task :default => []; Rake::Task[:default].clear
Джо Лісс

Rake :: Task.clear Rake :: Task ['rake_task']. Відновити Rake :: Task ['rake_task']. Invoke Це нормально?
faisal bhatti

13

Вам потрібно видалити завдання за замовчуванням перед додаванням власного:

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

Досить популярна ідіомою є створення зручного методу , званим 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 )


1
Дякую, Алекс, найкращий для мене прекрасний, а також більш очевидний щодо того, що відбувається, заради того, хто ще дивиться на це. Вітаємо
Макс Вільямс

6

Створіть новий файл 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']

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.