Tengo una tarea de rastrillo que necesita insertar un valor en múltiples bases de datos.
Me gustaría pasar este valor a la tarea de rastrillo desde la línea de comando, o desde otra tarea de rastrillo.
¿Cómo puedo hacer esto?
ruby
command-line
rake
command-line-arguments
Tilendor
fuente
fuente
Respuestas:
Las opciones y dependencias deben estar dentro de las matrices:
Entonces
NOTA DE RAILS:
fuente
rake thing:work[1, 2, 3]
ya que no funcionará y obtendrás un errorDon't know how to build task
rake thing:work'[1,2,3]'
rake thing:work\[1,2,3\]
o estorake 'thing:work[1,2,3]'
:environment
símbolo de su tarea. aplicaciones de rieles tienen una: tarea de entorno ...t
mediostask
, ¿por qué no usar simplementetask
como el param name?Puede especificar argumentos formales en rake agregando argumentos de símbolo a la llamada de tarea. Por ejemplo:
Luego, desde la línea de comando:
Como se demostró en el segundo ejemplo, si desea usar espacios, las comillas alrededor del nombre de destino son necesarias para evitar que el shell divida los argumentos en el espacio.
Al observar el código en rake.rb , parece que rake no analiza las cadenas de tareas para extraer argumentos de requisitos previos, por lo que no puede hacerlo
task :t1 => "dep[1,2]"
. La única forma de especificar diferentes argumentos para un requisito previo sería invocarlo explícitamente dentro de la acción de la tarea dependiente, como en:invoke_my_task
y:invoke_my_task_2
.Tenga en cuenta que algunos shells (como zsh) requieren que escape de los corchetes:
rake my_task\['arg1'\]
fuente
WARNING: 'task :t, arg, :needs => [deps]' is deprecated. Please use 'task :t, [args] => [deps]' instead.
zsh: no matches found: ...
), por lo que necesita para escapar de los soportes:rake my_task\['arg1'\]
. De robots.thoughtbot.com/post/18129303042/…Además de responder por kch (no encontré cómo dejar un comentario a eso, lo siento):
No tiene que especificar variables como
ENV
variables antes delrake
comando. Simplemente puede configurarlos como parámetros de línea de comandos habituales como ese:y acceda a los de su archivo rake como variables ENV como tales:
fuente
p
?Si desea pasar argumentos con nombre (por ejemplo, con estándar
OptionParser
) puede usar algo como esto:tenga en cuenta
--
que es necesario para pasar por alto los argumentos estándar de Rake. En caso de trabajar con el rastrillo 0.9.x , <= 10.3.x .Newer Rake ha cambiado su análisis
--
, y ahora debe asegurarse de que no se haya pasado alOptionParser#parse
método, por ejemplo conparser.parse!(ARGV[2..-1])
exit
al final se asegurará de que los argumentos adicionales no se interpreten como tarea Rake.También el atajo para argumentos debería funcionar:
Cuando los scripts de rastrillo se ven así, tal vez sea hora de buscar otra herramienta que permita esto de manera inmediata.
fuente
--option-names
. Mi única sugerencia sería usar enexit
lugar deabort
comoabort
lo dejará con un código de retorno de 1 al shell. Si la tarea de rake es parte de un script de nivel superior, es más común asumir que una salida distinta de cero es algún tipo de error.--
? ¿Como pasarrake
argumentos a la tarea real o algo así? ¿Me gustatask :my_task, :*args do |t, args|
o algo?{username}
está aquí. Donde se usa ¿Por qué no está allí-u {username}
? Saludos10.4.1
y se revirtió10.4.2
. github.com/ruby/rake/commit/…He encontrado la respuesta de estos dos sitios web: Net Maniac y Aimred .
Necesitas tener una versión> 0.8 de rastrillo para usar esta técnica
La descripción normal de la tarea de rastrillo es la siguiente:
Para pasar argumentos, haga tres cosas:
Para acceder a los argumentos en el script, use args.arg_name
Para llamar a esta tarea desde la línea de comando, pásele los argumentos en [] s
saldrá
y si desea llamar a esta tarea desde otra tarea y pasarle argumentos, use invoke
entonces el comando
saldrá
No he encontrado una manera de pasar argumentos como parte de una dependencia, ya que el siguiente código se rompe:
fuente
'task :t, arg, :needs => [deps]' is deprecated. Please use 'task :t, [args] => [deps]' instead.
Otra opción comúnmente utilizada es pasar variables de entorno. En su código, los lee
ENV['VAR']
y puede pasarlos justo antes delrake
comando, comofuente
rake blah -- --these --go --to --a-program
(observe el--
rastrillo para decirle que sus interruptores han terminado), consulte stackoverflow.com/questions/5086224/…En realidad, @Nick Desjardins respondió perfecto. Pero solo por educación: puedes usar un enfoque sucio: usar
ENV
argumentosfuente
No pude entender cómo pasar args y también el entorno: hasta que resolví esto:
Y luego llamo así:
fuente
fuente
rake task_name[hello, world]
Solo quería poder ejecutar:
Simple, ¿verdad? (¡No!)
Rake interpreta
arg1
yarg2
como tareas, e intenta ejecutarlas. Entonces abortamos antes de que lo haga.¡Toma eso, paréntesis!
Descargo de responsabilidad : quería poder hacer esto en un proyecto de mascotas bastante pequeño. No está destinado al uso en el "mundo real" ya que pierde la capacidad de encadenar tareas de rastrillo (es decir
rake task1 task2 task3
). OMI no vale la pena. Solo usa lo feorake task[arg1,arg2]
.fuente
_, arg1, arg2 = ARGV
ya que el primer argumento era el nombre de la tarea de rastrillo. Pero eseexit
es un buen truco.rake task[arg1,arg2] && rake task2 && rake task3
No estoy seguro si eso es menos feo querake task[arg1,arg2] task2 task3
. Probablemente menos eficiente sin embargo._, *args = ARGV
¡Es perfecto para capturar todos los argumentos posteriores! ¡Montones de gracias!Utilizo un argumento ruby regular en el archivo rastrillo:
luego apago las tareas de rastrillo en la parte inferior del archivo (ya que el rastrillo buscará una tarea basada en ese nombre de argumento).
línea de comando:
esto me parece más limpio que el var = foo ENV var y la tarea argumenta [bla, blah2] soluciones.
el trozo es un poco jenky, pero no está mal si solo tienes algunos entornos que son una configuración única
fuente
dup
al final: db = ARGV [1] .dupdb = ARGV[1].dup unless ARGV[1].nil?
para evitar la excepción de duplicar un cero.Las formas de pasar el argumento son correctas en la respuesta anterior. Sin embargo, para ejecutar la tarea de rake con argumentos, hay un pequeño tecnicismo involucrado en la versión más nueva de rails
Funcionará con rake "espacio de nombres: nombre de tarea ['argumento1']"
Tenga en cuenta las comillas invertidas al ejecutar la tarea desde la línea de comandos.
fuente
Para pasar argumentos a la tarea predeterminada, puede hacer algo como esto. Por ejemplo, decir "versión" es su argumento:
Entonces puedes llamarlo así:
o
o
Sin embargo, no he encontrado una manera de evitar especificar el nombre de la tarea (predeterminado o compilación) al pasar argumentos. Me encantaría saber si alguien sabe de alguna manera.
fuente
Me gusta la sintaxis de "cadena de consulta" para pasar argumentos, especialmente cuando hay muchos argumentos para pasar.
Ejemplo:
La "cadena de consulta" es:
Advertencia: tenga en cuenta que la sintaxis es
rake "mytask[foo=bar]"
y NOrake mytask["foo=bar"]
Cuando se analiza dentro de la tarea de rastrillo usando
Rack::Utils.parse_nested_query
, obtenemos unHash
:(Lo bueno es que puedes pasar hash y matrices, más abajo)
Así es como lograr esto:
Aquí hay un ejemplo más extenso que estoy usando con Rails en mi gema retrayed_job_active_record_threaded :
Analizado de la misma manera que arriba, con una dependencia del entorno (para cargar el entorno Rails)
Da lo siguiente en
options
fuente
Si no puede molestarse en recordar qué posición de argumento es para qué y desea hacer algo como un hash de argumento de rubí. Puede usar un argumento para pasar una cadena y luego volver a expresar esa cadena en un hash de opciones.
Y en la línea de comando que obtienes.
fuente
La mayoría de los métodos descritos anteriormente no funcionaron para mí, tal vez están en desuso en las versiones más recientes. La guía actualizada se puede encontrar aquí: http://guides.rubyonrails.org/command_line.html#custom-rake-tasks
Copie y pegue la respuesta de la guía aquí:
Invocarlo así
fuente
Para ejecutar tareas de rastrillo con estilo de argumentos tradicionales:
Y luego usa:
Agregue el siguiente parche de gema de rastrillo:
fuente
Al pasar los parámetros, es mejor que la opción sea un archivo de entrada, puede ser un excel a json o lo que necesite y, a partir de ahí, lea la estructura de datos y las variables que necesita, incluido el nombre de la variable según sea necesario. Para leer un archivo puede tener la siguiente estructura.
Ejemplo json
Ejecución
fuente