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?

4voto

bbbco Punkte 1478

Wenn Sie möchten, dass jede Aufgabe unabhängig von Fehlern ausgeführt wird, können Sie etwas wie folgt 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

-1voto

Gizmomogwai Punkte 2396

Ich würde vorschlagen, keine allgemeinen Debug- und Freigabe-Aufgaben zu erstellen, wenn das Projekt wirklich etwas ist, das kompiliert wird und somit in Dateien resultiert. Sie sollten sich für Datei-Aufgaben entscheiden, was in Ihrem Beispiel durchaus machbar ist, da Sie angeben, dass Ihre Ausgaben in verschiedene Verzeichnisse gehen. Angenommen, Ihr Projekt kompiliert nur eine test.c Datei nach out/debug/test.out und out/release/test.out mit gcc, dann könnten Sie 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]

Diese Einstellung kann wie folgt verwendet werden:

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

Dies ist ein wenig mehr, als verlangt wurde, zeigt aber meine Punkte:

  1. Ausgabeverzeichnisse werden je nach Bedarf erstellt.
  2. die Dateien werden nur bei Bedarf neu kompiliert (dieses Beispiel ist nur für die einfachsten test.c-Dateien korrekt).
  3. haben Sie alle Aufgaben griffbereit, wenn Sie den Release-Build oder den Debug-Build auslösen wollen.
  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 Tasks haben. Die Wiederverwendung des Codes für die Build-Tasks erfolgt durch die Wiederverwendung des Codes zur Definition der Build-Tasks. Sehen Sie, wie die Schleife nicht dieselbe Task zweimal ausführt, sondern stattdessen Tasks erstellt, die später ausgelöst werden können (entweder durch die All-Task oder durch die Auswahl einer von ihnen auf der Rake-Kommandozeile).

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