generators - scaffold ruby on rails
¿Cómo declaras una tarea de Rake que depende de una tarea parametrizada? (2)
Args se pasa a través de la pila de llamadas. Solo debe 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
.
Este es un ejemplo que muestra los argumentos con nombre definidos en otros lugares que fluyen hacia 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
Rastrillo 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 nulo.
Versión de rake, version 10.0.3
: rake, version 10.0.3
Versión de Ruby: ruby 1.9.3p125 (2012-02-16 revision 34643) [x86_64-darwin11.3.0]
He visto ejemplos en los que una tarea tiene parámetros y una tarea de dependencia como:
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ía los parámetros a la tarea de nombre si fuera una dependencia de tarea como:
task :sendLetter => :name
#do something
end
Lo más cerca que probablemente vas a conseguir es
task :sendLetter do
task(:name).invoke("first", "last")
end
o
task :sendLetter do
task(:name).execute(["first", "last"])
end
Puedes hacer algo como
task :sendLetter => task(:name).invoke("first", "last")
pero eso invocará el name
independientemente de si solicitas sendLetter
o no.
Task#invoke
solo llama a la tarea si no se ha llamado y llama primero a cualquier requisito no llamado. Task#execute
siempre llama a la tarea pero no llama ningún prerrequisito. Tenga en cuenta que los parámetros no afectan la naturaleza de una sola llamada de la Task#invoke
de Task#invoke
: si invoca una tarea parametrizada dos veces, solo se ejecutará una vez, ya sea que los parámetros sean diferentes o no.