2010-08-27 11 views
23

Quiero pasar parámetros múltiples pero no sé los números. Tales como nombres de modelo. ¿Cómo paso esos parámetros a una tarea de rake y cómo accedo a esos parámetros dentro de la tarea de rake?cómo pasar múltiples parámetros para rake tarea

igual, $ rake test_rake_task[par1, par2, par3]

Respuesta

9

Usted puede intentar algo así:

rake test_rake_task SOME_PARAM=value1,value2,value3 

Y en la tarea rake:

values = ENV['SOME_PARAM'].split(',') 
+0

no puedo pasar el parámetro de esta manera ?? rastrillar test_rake_task [par1, par2, par3] y acceder a él ?? –

+0

He descrito la única forma en que sé pasar los parámetros a la tarea de rake. Resulta imposible ejecutar la tarea de rake con algo como 'rake test_rake_task [par1, par2, par3]'. – lest

+0

No es imposible ejecutar la tarea de rake como tal, la respuesta de Henry a continuación funciona para hacer justamente eso. –

53

Rake soporta el paso de parámetros directamente a una tarea mediante una matriz, sin usando el truco ENV.

definir su tarea como esta:

task :my_task, [:first_param, :second_param] => :environment do |t, args| 
    puts args[:first_param] 
    puts args[:second_param] 
end 

y lo llaman así:

rake my_task[Hello, World] 
=> Hello 
    World 

This article by Patrick Reagan on the Viget blog explains it nicely

+12

Esto no respondió la pregunta. El OP dice que no sabe la cantidad de argumentos que se pasan. –

+1

@Henry ¿Puede describir el significado/uso de ': needs' o proporcionar documentación sobre este símbolo? – JJD

+1

@JJD Si está utilizando la última versión de Ruby, creo que: las necesidades están en desuso. : necesita dependencias indicadas.Pruebe algo como 'task: test, [: arg1,: arg2] =>: environment do | t, args | #Código final' – TradeRaider

8

Use args.values.

task :events, 1000.times.map { |i| "arg#{i}".to_sym } => :environment do |t, args| 
    Foo.use(args.values) 
end 
+0

Necesitaba usar * args.to_hash.values ​​*, y generaba mil argumentos de 4 caracteres en mal estado * rake -T *, así que usé * (? A ..? E) .to_a * en su lugar. – michelpm

7

Encontrado este ejemplo en este blog post y la sintaxis parece un poco más limpia.

Por ejemplo, si usted tenía una tarea say_hello, que se podría llamar con cualquier número de argumentos, así:

$ rake say_hello Earth Mars Venus 

Así es como funciona:

task :say_hello do 
    # ARGV contains the name of the rake task and all of the arguments. 
    # Remove/shift the first element, i.e. the task name. 
    ARGV.shift 

    # Use the arguments 
    puts 'Hello arguments:', ARGV 

    # By default, rake considers each 'argument' to be the name of an actual task. 
    # It will try to invoke each one as a task. By dynamically defining a dummy 
    # task for every argument, we can prevent an exception from being thrown 
    # when rake inevitably doesn't find a defined task with that name. 
    ARGV.each do |arg| 
    task arg.to_sym do ; end 
    end 

end 
+0

efecto secundario: no podrá utilizar otras tareas con este comando uno a uno – Sergey

43

Usted puede utilizar args.extras para iterar sobre todos los argumentos sin indicar explícitamente cuántos parámetros tiene.

Ejemplo:

desc "Bring it on, parameters!" 
task :infinite_parameters do |task, args| 
    puts args.extras.count 
    args.extras.each do |params| 
     puts params 
    end   
end 

Para ejecutar:

rake infinite_parameters['The','World','Is','Just','Awesome','Boomdeyada'] 

de salida:

6 
The 
World 
Is 
Just 
Awesome 
Boomdeyada 
+1

Con mucho, la mejor manera de pasar parámetros sin nombre a una tarea de rake sin hacking de entorno. – Epigene

+1

Tenga en cuenta que esto es cierto para más (o menos) versiones recientes de rake. –

+2

Esto definitivamente debería ser la respuesta. – Siraris

Cuestiones relacionadas