2011-04-20 6 views
19

ejemplos que he visto en una tarea tiene parámetros y una tarea de dependencia como:¿Cómo declaras una tarea de Rake que depende de una tarea parametrizada?

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 

¿Cómo pasar parámetros a la nombre tarea si se trataba de una dependencia entre tareas como:

task :sendLetter => :name 
    #do something 
end 

Respuesta

21

Los registros se transmiten a través de la pila de llamadas. Solo necesita asegurarse de que su tarea de nivel superior capture todos los argumentos que requieren todas las dependencias. En su caso, querrá poner first_name y last_name en la tarea send_letter.

Aquí hay un ejemplo que muestra argumentos nombrados definidos en otro lugar que fluyen a la dependencia (incluso si no están definidos en la dependencia), pero el argumento que no coincide con el nombre del argumento de la tarea de nivel superior es nulo .

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 

Correr rake foo[baz] yeilds

BAR NOM: 
BAR NAME: baz 
FOO NAME: baz 

Es interesante notar que el uso de args.with_defaults(nom: 'Jaques') en la tarea foo no tiene efecto en la tarea dependiente - nom sigue siendo nula.

versión Rake: rake, version 10.0.3

versión de Ruby: ruby 1.9.3p125 (2012-02-16 revision 34643) [x86_64-darwin11.3.0]

+1

Gracias, gran ayuda. Pero dios, espero que las variables metasintácticas vayan a morir y vuelvan buenos ejemplos creativos. –

7

Lo más cerca que probablemente va a conseguir es bien

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

o

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

Usted puede hacer algo como

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

pero que invocará name independientemente de si usted pide sendLetter o no.

Task#invoke solo invoca la tarea si no se ha llamado y llama a todos los prereqs no llamados primero. Task#execute siempre llama a la tarea pero no llama a ningún prerrequisito. Tenga en cuenta que los parámetros no afectan la naturaleza call-one de Task#invoke: si invoca una tarea parametrizada dos veces, solo se ejecutará una vez, independientemente de si los parámetros son diferentes o no.

Cuestiones relacionadas