Wie werden Rake-Aufgaben in Rake-Aufgaben ausgeführt?

Ich habe eine Rakefile, die das Projekt auf zwei Arten kompiliert, entsprechend der globalen Variable $build_type , die sein kann :debug oder :release (die Ergebnisse gehen in separate Verzeichnisse):

 task :build => [:some_other_tasks] do end 

Ich möchte eine Aufgabe erstellen, die das Projekt wiederum mit beiden Konfigurationen 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 als eine Methode zu bezeichnen? Oder wie kann ich etwas ähnliches erreichen?

   

Wenn Sie möchten, dass sich die Aufgabe wie eine Methode verhält, wie wäre es 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 die Idiome von rake , hier sind Ihre Möglichkeiten, zusammengestellt aus früheren Antworten:

  • Dies führt immer die Aufgabe aus, aber ihre Abhängigkeiten werden nicht ausgeführt:

     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 zuerst der Status “request_invoked” der Task zurückgesetzt, sodass die Task dann erneut ausgeführt werden kann, Abhängigkeiten und alle:

     Rake::Task["build"].reenable Rake::Task["build"].invoke 

    (Beachten Sie, dass bereits aufgerufene Abhängigkeiten nicht erneut ausgeführt werden)

beispielsweise:

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

Das sollte dich aussortieren, ich brauchte nur das Gleiche.

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

Wenn Sie möchten, dass jede Aufgabe unabhängig von Fehlern ausgeführt wird, können Sie Folgendes tun:

 task :build_all do [:debug, :release].each do |t| ts = 0 begin Rake::Task["build"].invoke(t) rescue ts = 1 next ensure Rake::Task["build"].reenable # If you need to reenable end return ts # Return exit code 1 if any failed, 0 if all success end end 

Ich würde vorschlagen, keine allgemeinen Debug- und Release-Aufgaben zu erstellen, wenn das Projekt wirklich etwas ist, das kompiliert wird und so zu Dateien führt. Sie sollten mit Datei-Aufgaben gehen, was in Ihrem Beispiel durchaus machbar ist, da Sie angeben, dass Ihre Ausgabe in verschiedene Verzeichnisse geht. Sagen Sie, Ihr Projekt kompiliert nur eine test.c-Datei, um aus / debug / test.out und out / release / test.out mit gcc Sie könnten Ihr Projekt wie folgt einrichten:

 WAYS = ['debug', 'release'] FLAGS = {} FLAGS['debug'] = '-g' FLAGS['release'] = '-O' def out_dir(way) File.join('out', way) end def out_file(way) File.join(out_dir(way), 'test.out') end WAYS.each do |way| desc "create output directory for #{way}" directory out_dir(way) desc "build in the #{way}-way" file out_file(way) => [out_dir(way), 'test.c'] do |t| sh "gcc #{FLAGS[way]} -c test.c -o #{t.name}" end end desc 'build all ways' task :all => WAYS.map{|way|out_file(way)} task :default => [:all] 

Dieses Setup kann wie folgt verwendet werden:

 rake all # (builds debug and release) rake debug # (builds only debug) rake release # (builds only release) 

Das tut ein wenig mehr wie verlangt, aber zeigt meine Punkte:

  1. Ausgabeverzeichnisse werden nach Bedarf erstellt.
  2. Die Dateien werden nur bei Bedarf neu kompiliert (dieses Beispiel ist nur für die einfachsten test.c-Dateien geeignet).
  3. Sie haben alle Aufgaben sofort zur Hand, wenn Sie den Release-Build oder den Debug-Build auslösen möchten.
  4. Dieses Beispiel enthält eine Möglichkeit, auch kleine Unterschiede zwischen Debug- und Release-Builds zu definieren.
  5. Es ist nicht nötig, eine Build-Task, die mit einer globalen Variable parametrisiert ist, erneut zu aktivieren, da die verschiedenen Builds nun unterschiedliche Aufgaben haben. Die Codereuse der Build-Task wird ausgeführt, indem der Code erneut verwendet wird, um die Build-Tasks zu definieren. sehen Sie, wie die Schleife die gleiche Aufgabe nicht zweimal ausführt, sondern stattdessen erstellte Aufgaben, die später ausgetriggers werden können (entweder durch die All-Task oder indem Sie eine davon auf der Rake-Kommandozeile auswählen).