Opciones de la línea de comandos de OptionParser al estilo Ruby

Ruby viene equipado con una herramienta potente y flexible para analizar las opciones de línea de comandos, OptionParser. Una vez que aprenda a usar esto, nunca volverá a mirar a través de ARGV manualmente. OptionParser tiene una serie de características que lo hacen bastante atractivo para los programadores de Ruby. Si alguna vez analizó las opciones a mano en Ruby o C, o con el getoptlong Función C, verá cuán bienvenidos son algunos de estos cambios.

  • OptionParser es SECO. Solo tiene que escribir el modificador de la línea de comandos, sus argumentos, el código que se ejecutará cuando se encuentre y la descripción del modificador de la línea de comandos una vez en su secuencia de comandos. OptionParser generará automáticamente pantallas de ayuda para usted a partir de esta descripción, e inferirá todo sobre el argumento a partir de su descripción. Por ejemplo, sabrá el --archivo [ARCHIVO] La opción es opcional y toma un solo argumento. Además, sabrá que - [- no] -verbose Es realmente dos opciones y aceptará ambas formas.
  • instagram viewer
  • OptionParser convertirá automáticamente las opciones a una clase específica. Si la opción toma un entero, puede convertir cualquier cadena pasada en la línea de comando a un entero. Esto reduce algunos de los tedios involucrados en el análisis de las opciones de línea de comandos.
  • Todo está muy contenido. Todas las opciones están en el mismo lugar, y el efecto de la opción está junto a la definición de la opción. Si es necesario agregar, cambiar o si alguien simplemente quiere ver lo que hace, solo hay un lugar para buscar. Una vez que se analiza la línea de comandos, un solo Hash u OpenStruct contendrá los resultados.

Ya es suficiente, muéstrame algo de código

Aquí hay un ejemplo simple de cómo usar OptionParser. No utiliza ninguna de las funciones avanzadas, solo las básicas. Hay tres opciones, y una de ellas toma un parámetro. Todas las opciones son obligatorias. Allí están los -v / - detallado y -q / - rápido opciones, así como el -l / - archivo de registro opción. Además, el script toma una lista de archivos independientes de las opciones.

 #! / usr / bin / env ruby

 # Un script que pretenderá cambiar el tamaño de varias imágenes

 requiere 'optparse'


 # Este hash contendrá todas las opciones

 # analizado desde la línea de comandos por

 # OptionParser.

 opciones = {}


 optparse = OptionParser.new do | opts |

 # Establecer un banner, que se muestra en la parte superior

 # de la pantalla de ayuda.

 opts.banner = "Uso: optparse1.rb [opciones] archivo1 archivo2 ..."


 # Definir las opciones y lo que hacen.

 opciones [: detallado] = falso

 opts.on ('-v', '--verbose', 'Salida más información') do

 opciones [: detallado] = verdadero

 final


 opciones [: rápido] = falso

 opts.on ('-q', '--quick', 'Realizar la tarea rápidamente') hacer

 opciones [: rápido] = verdadero

 final


 opciones [: archivo de registro] = nulo

 opts.on ('-l', '--File de archivo FILE', 'Escribir registro en FILE') do | file |

 opciones [: archivo de registro] = archivo

 final


 # Esto muestra la pantalla de ayuda, todos los programas son

 # se supone que tiene esta opción.

 opts.on ('-h', '--help', 'Mostrar esta pantalla') do

 pone opta

 salida

 final

 final


 # Analiza la línea de comandos. Recuerda que hay dos formas

 # del método de análisis. El método 'analizar' simplemente analiza

 # ARGV, mientras que el "análisis!" El método analiza ARGV y elimina

 # cualquier opción encontrada allí, así como cualquier parámetro para

 # las opciones. Lo que queda es la lista de archivos para cambiar el tamaño.

 optparse.parse!


 pone "Ser detallado" si las opciones [: detallado]

 pone "Ser rápido" si las opciones [: rápido]

 pone "Logging to file # {options [: logfile]}" if options [: logfile]


 ARGV.each do | f |

 pone "Cambiar el tamaño de la imagen # {f} ..."

 dormir 0.5

 final

Examinando el Código

Para empezar, el optparse Se requiere biblioteca. Recuerda, esto no es un joya. Viene con Ruby, por lo que no es necesario instalar una gema o requerir rubygems antes de optparse.

Hay dos objetos interesantes en este script. El primero es opciones, declarado en el ámbito más alto. Es un simple vacío picadillo. Cuando se definen las opciones, escriben sus valores predeterminados en este hash. Por ejemplo, el comportamiento predeterminado es que este script no ser detallado, entonces opciones [: detallado] se establece en falso. Cuando se encuentran opciones en la línea de comandos, cambiarán los valores en opciones para reflejar su efecto. Por ejemplo, cuando -v / - detallado se encuentra, asignará verdadero a opciones [: detallado].

El segundo objeto interesante es optparse. Este es el OptionParser objetar en sí mismo. Cuando construyes este objeto, le pasas un bloque. Este bloque se ejecuta durante la construcción y creará una lista de opciones en estructuras de datos internas, y se preparará para analizar todo. Es en este bloque donde sucede toda la magia. Usted define todas las opciones aquí.

Definiendo opciones

Cada opción sigue el mismo patrón. Primero escribe el valor predeterminado en el hash. Esto sucederá tan pronto como el OptionParser esta construido. Luego, llamas al enmétodo, que define la opción en sí. Hay varias formas de este método, pero aquí solo se usa una. Los otros formularios le permiten definir conversiones automáticas de tipos y conjuntos de valores a los que se restringe una opción. Los tres argumentos utilizados aquí son la forma corta, la forma larga y la descripción de la opción.

los en El método inferirá varias cosas de la forma larga. Una cosa es inferir es la presencia de cualquier parámetro. Si hay algún parámetro presente en la opción, los pasará como parámetros al bloque.

Si la opción se encuentra en la línea de comandos, el bloque pasó a en Se ejecuta el método. Aquí, los bloques no hacen mucho, solo establecen valores en el hash de opciones. Se podría hacer más, como verificar que existe un archivo al que se hace referencia, etc. Si hay algún error, se pueden generar excepciones desde estos bloques.

Finalmente, se analiza la línea de comandos. Esto sucede llamando al ¡analizar gramaticalmente! método en un OptionParser objeto. En realidad, hay dos formas de este método, analizar gramaticalmente y ¡analizar gramaticalmente!. Como implica la versión con el signo de exclamación, es destructiva. No solo analiza la línea de comandos, sino que también elimina todas las opciones encontradas en ARGV. Esto es importante, dejará solo la lista de archivos suministrados después de las opciones en ARGV.

instagram story viewer