2009-12-11 4 views
24

Au lieu de courir individuellement chaque tâche de coupe comme celui-ci:Combinant de nombreuses tâches de râteau dans une tâche de râteau

rake db:drop 
rake db:create 
rake db:migrate 
rake db:load 

Je veux exécuter une tâche de râteau qui fait tout pour.

C'est ce que j'ai pour mon rakefile:

desc 'This rebuilds development db' 
namespace :rebuild_dev do 
Rake::Task["db:drop"].execute 
Rake::Task["db:create"].execute 
Rake::Task["db:migrate"].execute 
Rake::Task["db:load"].execute 
end 

Le ne fonctionne pas au-dessus quand je le lance.

Répondre

23

Vous voulez invoke pas execute. Un petit extrait de mon propre code montrant comment passer des variables:

namespace :clients do 

    task :create, [:client] => ["clients:creation:checks"] do |t, args| 
    Rake::Task["clients:creation:git"].invoke(client, password) 
    Rake::Task["server:virtualhost:create"].invoke(client) 
    Rake::Task["server:virtualhost:enable"].invoke(client) 
    Rake::Task["server:reload"].invoke 
    Rake::Task["db:roles:create"].invoke(client, password) 
    Rake::Task["db:create"].invoke(client, client) 
    Rake::Task["db:migrate"].invoke(client) 
    end 

end 

Alternativement, vous pouvez rendre la tâche à une autre tâche dépend comme je l'ai fait ci-dessus avec :create selon clients:creation:checks. Pour clarifier, un espace de noms est pour les tâches de regroupement, vous devez donc réellement définir les tâches dans l'espace de noms comme je l'ai indiqué ci-dessus. Vous ne pouvez pas simplement appeler des tâches depuis un espace de noms.

donc votre code ci-dessus doit être:

desc 'This rebuilds development db' 
task :rebuild_dev do 
    Rake::Task["db:drop"].invoke 
    Rake::Task["db:create"].invoke 
    Rake::Task["db:migrate"].invoke 
    Rake::Task["db:load"].invoke 
end 
+0

Merci! C'était invoqué! – Amir

+0

pourquoi 'invoke', puis-je utiliser' execute' signifie 'execute (client)' –

+1

@AMICMING - 'execute' n'exécutera que la tâche tandis que' invoke' exécutera toutes les dépendances. En outre, il exécutera uniquement la tâche si nécessaire. * Note: C'était le cas il y a 8 ans; Honnêtement, je ne sais pas si cela a changé depuis. * Http://chrisroos.co.uk/blog/2007-12-06-ruby-rake-invoke-vs-execute –

3
namespace :rebuild_dev do 
desc 'This rebuilds development db' 
    task :clean_slate => :environment do 
    Rake::Task["db:drop"].invoke 
    Rake::Task["db:create"].invoke 
    Rake::Task["db:migrate"].invoke 
    Rake::Task["db:load"].invoke 
    end 
end 
64

Vous pouvez le faire avec dépendances sur une tâche sans corps.

desc 'This rebuilds development db' 
task :rebuild_dev => ["db:drop", "db:create", "db:migrate", "db:load"] 
+1

+1 - Intéressant. Je n'ai jamais su cela. Merci d'avoir répondu! –

+0

Comment cela fonctionnerait-il lors du passage des params aux sous-tâches? –

Questions connexes