439 Stimmen

Wie kann man Rake-Tasks aus Rake-Tasks heraus ausführen?

Ich habe ein Rakefile, das das Projekt auf zwei Arten kompiliert, je nach der globalen Variable $build_type die sein können :debug o :release (die Ergebnisse werden in separaten Verzeichnissen gespeichert):

task :build => [:some_other_tasks] do
end

Ich möchte eine Aufgabe erstellen, die das Projekt mit beiden Konfigurationen nacheinander kompiliert, etwa so:

task :build_all do
  [ :debug, :release ].each do |t|
    $build_type = t
    # call task :build with all the tasks it depends on (?)
  end
end

Gibt es eine Möglichkeit, eine Aufgabe so aufzurufen, als wäre sie eine Methode? Oder wie kann ich etwas Ähnliches erreichen?

670voto

kch Punkte 73753

Wenn sich die Aufgabe wie eine Methode verhalten soll, wie wäre es dann mit einer tatsächlichen Methode?

task :build => [:some_other_tasks] do
  build
end

task :build_all do
  [:debug, :release].each { |t| build t }
end

def build(type = :debug)
  # ...
end

Wenn Sie sich lieber an rake Hier sind Ihre Möglichkeiten, zusammengestellt aus früheren Antworten:

  • Dabei wird die Aufgabe immer ausgeführt, nicht aber ihre Abhängigkeiten:

    Rake::Task["build"].execute
  • Dieser führt die Abhängigkeiten aus, aber er führt die Aufgabe nur aus, wenn sie nicht bereits aufgerufen wurde:

    Rake::Task["build"].invoke
  • Dadurch wird zunächst der Status "bereits aufgerufen" der Aufgabe zurückgesetzt, so dass die Aufgabe wieder ausgeführt werden kann, einschließlich aller Abhängigkeiten:

    Rake::Task["build"].reenable
    Rake::Task["build"].invoke
  • Beachten Sie, dass bereits aufgerufene Abhängigkeiten nicht automatisch erneut ausgeführt werden, es sei denn, sie werden erneut aktiviert. In Rake >= 10.3.2 können Sie die folgenden Anweisungen verwenden, um auch diese wieder zu aktivieren:

    Rake::Task["build"].all_prerequisite_tasks.each(&:reenable)

131voto

Marcin Urbanski Punkte 2443

Zum Beispiel:

Rake::Task["db:migrate"].invoke

61voto

darkliquid Punkte 3895
task :build_all do
  [ :debug, :release ].each do |t|
    $build_type = t
    Rake::Task["build"].reenable
    Rake::Task["build"].invoke
  end
end

Das sollte Ihnen helfen, ich habe gerade dasselbe gebraucht.

20voto

Neeraj Kumar Punkte 4355
task :invoke_another_task do
  # some code
  Rake::Task["another:task"].invoke
end

14voto

pjb3 Punkte 4961
task :build_all do
  [ :debug, :release ].each do |t|
    $build_type = t
    Rake::Task["build"].execute
  end
end

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X