72 votes

Remplacement des tâches de rake par défaut des rails

J'ai un rails 2.2 projet dans lequel je veux remplacer la fonctionnalité de la "rake db:test:préparer" de la tâche. J'ai pensé que ce serait le travail:

#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

mais ça ne marche pas, j'obtiens la tâche standard de comportement. si je change le nom de la tâche en :prepare2 puis effectuez l' rake db:test:prepare2 alors qu'elle fonctionne très bien. La conclusion naturelle-je tirer de ceci est que mon rake tâches sont définies avant la rails, donc le mien est remplacée par la norme :préparer la tâche.

Quelqu'un peut-il voir comment je peux résoudre ce problème? Je préfère le remplacer que d'avoir à utiliser une nouvelle tâche. Merci, max

124voto

Brendon Muir Points 1862

Qu'en est-il de:

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

Trouvé que flottant autour des internets.

11voto

Alex Peattie Points 8754

Vous devez supprimer la tâche par défaut avant d'ajouter la vôtre:

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

Un idiome assez populaire est de créer une méthode pratique appelée remove_task comme ceci:

 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 )

6voto

Eric Guo Points 382

Créez un nouveau fichier project.rake dans lib / tasks / et insérez-y le code ci-dessous.

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

inspiré par le blog de Krasimir Angelov

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X