2009-12-11 19 views
24

Anstatt jede Rake Aufgabe wie diese einzeln laufen:Kombination vieler Rake Aufgaben in einem Rake Aufgabe

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

Ich möchte ein Rake Aufgabe auszuführen, die alle tut für.

Dies ist, was ich für meine Rakefile haben:

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 

Die oben nicht funktioniert, wenn ich es laufen.

Antwort

23

Sie möchten invoke nicht execute. Ein kleiner Auszug aus meinem eigenen Code zeigt, wie Variablen zu übergeben:

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 

Alternativ können Sie die Aufgabe auf einer anderen Aufgabe abhängig machen, wie ich oben getan haben, mit :create je nach clients:creation:checks.

Nur um zu verdeutlichen, ein Namespace ist zum Gruppieren von Aufgaben, so dass Sie tatsächlich die Aufgaben innerhalb des Namespace wie ich oben definieren müssen. Sie können Tasks nicht einfach innerhalb eines Namespaces aufrufen.

so über den Code sollte sein:

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

Vielen Dank! Es wurde aufgerufen! – Amir

+0

Warum 'invoke', kann ich' execute' verwenden, bedeutet 'execute (client)' –

+1

@AMICMING - 'execute' wird nur die Aufgabe ausführen, während' invoke' alle Abhängigkeiten ausführt. Darüber hinaus wird die Aufgabe nur bei Bedarf ausgeführt. * Hinweis: Dies war der Fall vor 8 Jahren; Ich weiß ehrlich gesagt nicht, ob es sich seitdem geändert hat. * 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

Sie es mit Abhängigkeiten von einer Aufgabe ohne Körper tun können.

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

+1 - Interessant. Ich habe das niemals gewusst. Danke für die Antwort! –

+0

Wie würde das funktionieren, wenn params an die Unteraufgaben übergeben wird? –