2015-04-23 22 views
5

Ich bin auf der Suche nach einer Möglichkeit zu überprüfen, ob eine bestimmte Rake-Aufgabe innerhalb der Rakefile vorhanden ist. Ich habe eine Aufgabenabhängigkeit, die ich nur als eine Abhängigkeit einschließen möchte, wenn diese Aufgabe verfügbar ist. In diesem speziellen Fall ist die Aufgabe nur in einem Rails-Projekt verfügbar, aber ich möchte, dass meine Rake-Aufgaben auch in einer allgemeineren Ruby-Anwendungsumgebung funktionieren (nicht nur in Rails).Überprüfen, ob Rake-Task in Rakefile existiert

Ich möchte so etwas wie dies zu tun:

if tasks.includes?('assets:precompile') 
    task :archive => [:clean, :vendor_deps, 'assets:precompile'] 
    ... 
    end 
else 
    task :archive => [:clean, :vendor_deps] 
    ... 
    end 
end 

Was ist der beste Weg ist, bedingt eine Aufgabe Abhängigkeit in einer Harke Aufgabe enthalten?

Antwort

11

was ist so etwas wie dies zu tun? Rufen Sie die Aufgabe auf, wenn sie vorhanden ist, anstatt sie explizit zu definieren.

task :archive => [:clean, :vendor_deps] do 
    Rake.application["assets:precompile"].invoke if Rake::Task.task_defined?('assets:precompile') 
    .... 
    end 

oder noch einfacher. Da Sie die Aufgabe erneut hinzufügen können, scheint auch so etwas zu funktionieren.

task :archive => [:clean, :vendor_deps] do 
    ... 
    end 
task :archive => "assets:precompile" if Rake::Task.task_defined?("assets:precompile") 

, die die Abhängigkeit von Assets bedingt hinzufügen: Vorkompilierung, wenn sie definiert ist.

+1

Wählen Sie @ Doons Antwort wegen der ausführlicheren Erklärung. – conorliv

+1

Fair genug. Sei nur vorsichtig mit 'invoke', da es nicht ganz so funktioniert wie Abhängigkeiten. Es wird immer die Rake-Task ausgeführt, während bei einer Abhängigkeit die Rake-Task nur ausgeführt wird, wenn sie noch nicht ausgeführt wurde. – Shadwell

+2

@Shadwell, ruft nicht auf, nur wenn benötigt, während Ausführen führt es unabhängig? Im ersten Beispiel sollte es es aufrufen, und wenn es nicht bereits ausgeführt wurde, wird es ausgeführt. Wenn es war, wird es immer noch aufrufen, aber nicht ausführen. Wenn ich das brauchte, würde ich wahrscheinlich nur das letzte Beispiel nützlicher/allgemeiner sein, denke ich. – Doon

1

sollten Sie in der Lage sein task_defined? zu verwenden:

Rake::Task.task_defined?('assets:precompile') 
Verwandte Themen