2015-04-23 14 views
5

Sto cercando un modo per poter verificare se esiste una determinata attività di rake all'interno del Rakefile. Ho una dipendenza di attività che voglio solo includere come dipendenza se quell'attività è disponibile. In questo caso particolare, l'attività è disponibile solo in un progetto Rails, ma voglio che le mie attività rake funzionino anche in un ambiente di applicazioni Ruby più generale (non solo Rails).Verifica se esiste rake task all'interno di Rakefile

voglio fare qualcosa di simile:

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

Qual è il modo migliore per includere condizionalmente una dipendenza compito in un task rake?

risposta

11

quello di fare qualcosa di simile? Richiama l'attività se esiste, al contrario di renderla una dipendenza esplicita?

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

o anche più semplice. Dato che specificare di nuovo l'attività ti consente di aggiungerlo, anche qualcosa del genere sembra funzionare.

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

che aggiungerà la dipendenza alle risorse in modo condizionale: precompila se è definita.

+1

Ho scelto la risposta di Doon a causa della spiegazione più approfondita. – conorliv

+1

Abbastanza giusto. Basta fare un po 'attenzione con 'invoke' dato che non funziona come le dipendenze. Eseguirà sempre l'attività rake mentre con una dipendenza eseguirà solo l'attività rake se non è già stata eseguita. – Shadwell

+2

@Shadwell, non invoca fare solo se necessario mentre execute lo esegue indipendentemente? Nel primo esempio dovrebbe richiamarlo e, se non è già stato eseguito, verrà eseguito. Se è stato esso invocherà ancora, ma non verrà eseguito. Se avessi bisogno di questo probabilmente solo l'ultimo esempio è più utile/generale, penso. – Doon

1

Si dovrebbe essere in grado di utilizzare task_defined?:

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