Analisi delle opzioni della riga di comando nel modo Ruby (OptionParser)

Ruby è dotato di uno strumento potente e flessibile per analizzare le opzioni della riga di comando, OptionParser. Una volta che hai imparato come usarlo, non tornerai più a guardare manualmente ARGV. OptionParser ha una serie di funzionalità che lo rendono abbastanza attraente per i programmatori Ruby. Se hai mai analizzato le opzioni a mano in Ruby o C, o con il getoptlong Funzione C, vedrai quanto sono graditi alcuni di questi cambiamenti.

  • OptionParser è DRY. Devi solo scrivere l'opzione della riga di comando, i suoi argomenti, il codice da eseguire quando viene incontrata e la descrizione dell'opzione della riga di comando una volta nello script. OptionParser genererà automaticamente schermate di aiuto per te da questa descrizione, così come dedurrà tutto sull'argomento dalla sua descrizione. Ad esempio, saprà il --file [FILE] L'opzione è facoltativa e accetta un singolo argomento. Inoltre, lo saprà --[-No] -verbose è davvero due opzioni e accetterà entrambi i moduli.
  • OptionParser convertirà automaticamente le opzioni in una classe specifica. Se l'opzione accetta un numero intero, può convertire qualsiasi stringa passata dalla riga di comando in un numero intero. Ciò riduce alcune delle noie coinvolte nell'analisi delle opzioni della riga di comando.
  • Tutto è molto contenuto. Tutte le opzioni si trovano nello stesso posto e l'effetto dell'opzione è proprio accanto alla definizione dell'opzione. Se le opzioni devono essere aggiunte, modificate o qualcuno vuole semplicemente vedere cosa fanno, c'è solo un posto dove cercare. Una volta analizzata la riga di comando, un singolo hash o OpenStruct conterrà i risultati.

Basta già, mostrami un po 'di codice

Quindi ecco un semplice esempio di come usare OptionParser. Non utilizza nessuna delle funzionalità avanzate, solo le basi. Esistono tre opzioni e una di esse accetta un parametro. Tutte le opzioni sono obbligatorie. Ci sono i -v / - verbose e -q / - veloce opzioni, così come il -l / - file di registro FILE opzione. Inoltre, lo script prende un elenco di file indipendenti dalle opzioni.

 #! / usr / bin / env ruby

 # Una sceneggiatura che farà finta di ridimensionare un numero di immagini

 richiede 'optparse'

 

 # Questo hash conterrà tutte le opzioni

 # analizzato dalla riga di comando da

 # OptionParser.

 opzioni = 

 

 optparse = OptionParser.new do | opts |

   # Imposta un banner, visualizzato in alto

   # della schermata di aiuto.

   opts.banner = "Uso: optparse1.rb [opzioni] file1 file2 ..."

 

   # Definisci le opzioni e cosa fanno

   opzioni [: verbose] = false

   opts.on ('-v', '--verbose', 'Output maggiori informazioni') do

     options [: verbose] = true

   fine

 

   opzioni [: veloce] = falso

   opts.on ('-q', '--quick', 'Esegui rapidamente l'attività')

     opzioni [: veloce] = vero

   fine

 

   opzioni [: logfile] = zero

   opts.on ('-l', '--logfile FILE', 'Scrivi registro su FILE') do | file |

     opzioni [: logfile] = file

   fine

 

   # Questo visualizza la schermata di aiuto, tutti i programmi lo sono

   # si presume che abbia questa opzione.

   opts.on ('-h', '--help', 'Visualizza questa schermata')

     mette opts

     Uscita

   fine

 fine

 

 # Analizza la riga di comando. Ricorda che ci sono due forme

 # del metodo di analisi. Il metodo 'parse' analizza semplicemente

 # ARGV, mentre "analizza!" il metodo analizza l'ARGV e lo rimuove

 # qualsiasi opzione trovata lì, così come qualsiasi parametro per

 # le opzioni. Ciò che resta è l'elenco dei file da ridimensionare.

 optparse.parse!

 

 mette "Essere prolisso" se opzioni [: verboso]

 mette "Essere veloci" se le opzioni [: veloce]

 inserisce "Registrazione nel file # options [: logfile]" se options [: logfile]

 

 ARGV.each do | f |

   mette "Ridimensionamento dell'immagine # f ..."

   dormire 0,5

 fine

Esame del codice

Per cominciare, il optparse è richiesta la biblioteca. Ricorda, questa non è una gemma. Viene fornito con Ruby, quindi non è necessario installare una gemma o richiedere RubyGems prima optparse.

Ci sono due oggetti interessanti in questo script. Il primo è opzioni, dichiarato nell'ambito più elevato. È un semplice hash vuoto. Quando le opzioni sono definite, scrivono i loro valori predefiniti in questo hash. Ad esempio, il comportamento predefinito è per questo script non sii prolisso, quindi [opzioni: verbose] è impostato su falso. Quando si incontrano opzioni sulla riga di comando, cambieranno i valori in opzioni per riflettere il loro effetto. Ad esempio, quando -v / - verbose viene rilevato, assegnerà true a [opzioni: verbose].

Il secondo oggetto interessante è optparse. Questo è il OptionParser oggetto stesso. Quando costruisci questo oggetto, gli passi un blocco. Questo blocco viene eseguito durante la costruzione e crea un elenco di opzioni nelle strutture di dati interne e si prepara a analizzare tutto. È in questo blocco che accade tutta la magia. Definisci tutte le opzioni qui.

Definizione delle opzioni

Ogni opzione segue lo stesso modello. Prima scrivi il valore predefinito nell'hash. Questo accadrà non appena il OptionParser è costruito. Successivamente, si chiama il su metodo, che definisce l'opzione stessa. Esistono diverse forme di questo metodo, ma qui ne viene utilizzata solo una. Gli altri moduli consentono di definire conversioni di tipo automatiche e insiemi di valori a cui è limitata un'opzione. I tre argomenti utilizzati qui sono la forma abbreviata, la forma lunga e la descrizione dell'opzione.

Il su Il metodo inferirà un numero di cose dalla forma lunga. Una cosa è inferirà è la presenza di eventuali parametri. Se sono presenti parametri sull'opzione, li passerà come parametri al blocco.

Se l'opzione viene rilevata sulla riga di comando, il blocco viene passato a su viene eseguito il metodo Qui, i blocchi non fanno molto, semplicemente impostano i valori nell'hash delle opzioni. Si potrebbe fare di più, come verificare l'esistenza di un file a cui si fa riferimento, ecc. In caso di errori, è possibile generare eccezioni da questi blocchi.

Infine, viene analizzata la riga di comando. Questo accade chiamando il parse! metodo su un OptionParser oggetto. Esistono in realtà due forme di questo metodo, parse e parse!. Come implica la versione con il punto esclamativo, è distruttiva. Non solo analizza la riga di comando, ma rimuoverà qualsiasi opzione trovata da ARGV. Questa è una cosa importante, lascerà solo l'elenco dei file forniti dopo le opzioni in ARGV.