tasks rails generators generate example ruby rake task

ruby - rails - ¿Por qué Rake no puede invocar múltiples tareas consecutivamente?



scaffold ruby on rails (2)

Tengo una tarea de Rake que he simplificado a continuación. Estoy usando Ruby 1.9 en Windows.

Tal vez le gustaría adivinar el resultado de llamar a la tarea de Rake "list_all_levels" a continuación? Debería ser:

"Hello level 1" "Hello level 2" "Hello level 3"

Pero por razones que desconozco, imprime solo "Hola nivel 1" y luego se detiene.

Es decir, siempre invoca solo la primera tarea. Si cambio la primera línea para pasar el arg "42", se imprimirá "Hola nivel 42" y luego se detendrá.

Me pregunto por qué no invoca la tarea 3 veces e imprime las 3 líneas. ¿Y hay alguna forma de hacer que funcione como yo esperaría?

task :list_all_levels => [] do Rake::Task[:list].invoke 1 Rake::Task[:list].invoke 2 Rake::Task[:list].invoke 3 end task :list, [:level] => [] do |t, args| puts "Hello level #{args.level}" end


Debe volver a habilitar la tarea antes de la nueva ejecución, para esto, solo necesita ejecutar el método Rehabilitar. Como el usuario Mark Rushakoff mencionado.

Rake::Task[:list].reenable


El problema es que invoke solo invoca la tarea si es necesario . Running rake --trace muestra:

(in /tmp/ruby) ** Invoke default (first_time) ** Execute default ** Invoke list (first_time) ** Execute list Hello level 1 ** Invoke list ** Invoke list

Entonces puede ver que está tratando de invocar la tarea :list haga una :list dos veces más. Pero una cosa que puede hacer es cambiar el cuerpo de la tarea principal a:

task :default => [] do Rake::Task[:list].invoke 1 Rake::Task[:list].reenable Rake::Task[:list].invoke 2 Rake::Task[:list].reenable Rake::Task[:list].invoke 3 end

luego se vuelve a necesitar la tarea :list e imprime correctamente las 3 instrucciones.

La manera más limpia de hacerlo es usar execute lugar de invoke :

task :default => [] do Rake::Task[:list].execute 1 Rake::Task[:list].execute 2 Rake::Task[:list].execute 3 end task :list, [:level] => [] do |t, args| puts "Hello level #{args}" end

Eso cambia tu declaración de puts para usar simplemente args.level en lugar de args.level por alguna razón. Hay algunas otras advertencias con el uso de la invoke execute sobre descrita en el enlace de arriba.