Ich habe ein Rakefile, das das Projekt auf zwei Arten kompiliert, entsprechend der globalen Variablen $build_type
, die :debug
oder sein kann :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.
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 es eine Methode? Oder wie kann ich etwas Ähnliches erreichen?
Rake::Task["build"].invoke
kann viel leistungsfähiger sein als die Verwendung,system rake build
da kein neuer Thread erstellt und die Rails-Umgebung geladen werden muss, wassystem rake build
zu tun ist.Antworten:
Wenn Sie die Aufgabe als Methode benötigen, wie wäre es dann mit einer tatsächlichen Methode?
Wenn Sie sich lieber an
rake
die Redewendungen halten möchten, finden Sie hier Ihre Möglichkeiten, die aus früheren Antworten zusammengestellt wurden:Dadurch wird die Aufgabe immer ausgeführt, ihre Abhängigkeiten werden jedoch nicht ausgeführt:
Dieser führt die Abhängigkeiten aus, führt die Aufgabe jedoch nur aus, wenn sie noch nicht aufgerufen wurde:
Dadurch wird zuerst der bereits aufgerufene Status der Aufgabe zurückgesetzt, sodass die Aufgabe erneut ausgeführt werden kann, Abhängigkeiten und alles:
(Beachten Sie, dass bereits aufgerufene Abhängigkeiten nicht erneut ausgeführt werden.)
quelle
Rake::Task['db:reset'].invoke
Rake::Task['with:args'].invoke("pizza")
ENV['VERSION'] = '20110408170816'; Rake::Task['db:migrate'].invoke
Siehe hier für weitere Erklärung.#reenable()
dass Pre-Reqs nicht wieder aktiviert werden und benötigt werden. Diese Hinzufügung zu Rake (> = 10.3.2)#all_prerequisite_tasks()
iteriert alle Aufgaben, einschließlich der Voranforderungen der Voranforderungen . Also,Rake::Task[task].all_prerequisite_tasks.each &:reenable
rake db:reset db:migrate
zum Beispiel in der Kommandozeile ). Können Sie etwas tun wie:Rake::Task["db:reset", "db:migrate"].invoke
zum Beispiel:
quelle
Das sollte dich klären, brauchte nur das Gleiche.
quelle
quelle
quelle
Wenn Sie möchten, dass jede Aufgabe unabhängig von Fehlern ausgeführt wird, können Sie Folgendes tun:
quelle
Ich würde vorschlagen, keine allgemeinen Debug- und Release-Aufgaben zu erstellen, wenn das Projekt wirklich kompiliert wird und so zu Dateien führt. Sie sollten mit Datei-Tasks arbeiten, was in Ihrem Beispiel durchaus machbar ist, da Sie angeben, dass Ihre Ausgabe in verschiedene Verzeichnisse geht. Angenommen, Ihr Projekt kompiliert nur eine test.c-Datei nach out / debug / test.out und out / release / test.out mit gcc. Sie können Ihr Projekt folgendermaßen einrichten:
Dieses Setup kann wie folgt verwendet werden:
Dies macht ein wenig mehr als gewünscht, zeigt aber meine Punkte:
quelle