2011-04-20 15 views
19

esempi che ho visto dove un compito sono parametri, e un compito di dipendenza come:Come si dichiara un'attività Rake che dipende da un'attività parametrizzata?

task :name, [:first_name, :last_name] => [:pre_name] do |t, args| 
    args.with_defaults(:first_name => "John", :last_name => "Dough") 
    puts "First name is #{args.first_name}" 
    puts "Last name is #{args.last_name}" 
end 

Come ti passare parametri al nome compito se fosse una dipendenza compito come:

task :sendLetter => :name 
    #do something 
end 

risposta

21

Gli argomenti vengono passati attraverso lo stack di chiamate. Devi solo assicurarti che il tuo compito di primo livello acquisisca tutti gli argomenti richiesti da tutte le dipendenze. Nel tuo caso ti consigliamo di inserire first_name e last_name nell'attività send_letter.

Ecco un esempio che mostra gli argomenti denominati definiti altrove che sfociano nella dipendenza (anche se non sono definiti nella dipendenza), ma l'argomento che non corrisponde al nome dell'argomento di attività di livello superiore è nullo .

desc 'Bar' 
task :bar, :nom do |task, args| 
    puts "BAR NOM: #{args[:nom]}" 
    puts "BAR NAME: #{args[:name]}" 
end 

desc 'Foo' 
task :foo, [:name] => :bar do |task, args| 
    puts "FOO NAME: #{args[:name]}" 
end 

Esecuzione rake foo[baz] yeilds

BAR NOM: 
BAR NAME: baz 
FOO NAME: baz 

E 'interessante notare che l'uso args.with_defaults(nom: 'Jaques') nel compito foo non ha alcun effetto sul compito dipendente - nom è ancora pari a zero.

versione Rake: rake, version 10.0.3

versione di Ruby: ruby 1.9.3p125 (2012-02-16 revision 34643) [x86_64-darwin11.3.0]

+1

Grazie, grande aiuto. Ma Dio spero che le variabili metasintattiche moriranno e torneranno buoni esempi creativi. –

7

il più vicino probabilmente stai andando ad ottenere è o

task :sendLetter do 
    task(:name).invoke("first", "last") 
end 

o

task :sendLetter do 
    task(:name).execute(["first", "last"]) 
end 

Si può fare qualcosa di simile

task :sendLetter => task(:name).invoke("first", "last") 

ma che invocare name indipendentemente dal fatto che si chiede per sendLetter oppure no.

Task#invoke chiama l'attività solo se non è stata richiamata e prima chiama tutti i prerequisiti non prenotati. Task#execute chiama sempre l'attività ma non chiama nessun prereq. Si noti che i parametri non influiscono sulla natura di call-once di Task#invoke: se si richiama due volte un'attività parametrizzata, verrà eseguita una sola volta, indipendentemente dal fatto che i parametri siano diversi.

Problemi correlati