2014-04-02 8 views
10

Come si aggiunge un'opzione --version alla mia richiesta di interfaccia Rubino Thor riga di comando.Aggiunta un'opzione --version ad un rubino Thor CLI

Per esempio io voglio essere in grado di eseguire

$ thor_app --version 
> thor_app version 1.0.0 

Questa domanda è legata alla Run a CLI Thor app without arguments or task name, ma in particolare per aggiungere un'opzione --version che non richiede un compito.

Nota
questo è stato scritto in seguito alla self-answer format. Le risposte addizionali e gli aggiornamenti sono incoraggiati

risposta

23

ho avuto una certa fortuna con questo approccio:

class CLI < Thor 
    map %w[--version -v] => :__print_version 

    desc "--version, -v", "print the version" 
    def __print_version 
    puts FooBar::VERSION 
    end 
end 

Le sottolineature che conducono garantisce non v'è un comando come yourapp version, e le forze yourapp --version o yourapp -v. Il contenuto desc permetterà di mostrare come -v, --version senza esporre __print_version.

+0

Questo è un po 'quello che fa il bundler. solo loro basta chiamare la versione compito e lasciare che la gente lo chiamano con 'bundler version' troppo (perché perché no?) https://github.com/bundler/bundler/blob/6afa89217cf052c58316da1f2be7bf54749ff9de/lib/bundler/cli.rb#L312- L316 – ZombieDev

+2

Questo dovrebbe essere restituito agli sviluppatori Thor per una correzione della documentazione. –

1

Finora l'opzione migliore che ho trovato è quella di creare un'opzione di classe booleana, che non appartiene a un'attività, che può essere referenziata da altre attività. L'esempio spesso utilizzato per un'opzione di classe è -v dettagliato, poiché tutte le attività possono utilizzarlo per determinare la loro rumorosità.

quindi creare una task 'versione' e rendere il compito di default, in modo che quando un compito viene definito è stato eseguito il compito di versione e possono reagire alla bandiera --version (opzione class).

class CLI < Thor 
    #include Thor::Actions 
    class_option :version, :type => :boolean 

    desc "version", "Show thor_app version" 
    def version 
    if options[:version] 
     puts "thor_app version #{find_version}" 
    end 
    end 
    default_task :version 

    no_tasks do 
    def find_version 
     ## Method can be replaced to look up VERSION 
     '1.0.0' 
    end 
    end 
end 
0

Non ho amato la soluzione accettata; finisce lista version come un comando, elencando --version e --no-version come opzioni globali, e se lo script viene eseguito senza opzioni è in silenzio piuttosto che dare aiuto.

Il meglio che ho potuto venire in mente è di farlo al di fuori Thor:

class CLI < Thor 
    . 
    . 
    . 
end 

if ARGV[0] == "--version" 
    puts "MyApp #{MyApp::VERSION}" 
    exit 
end 

CLI.start 

Questo ha l'inconveniente minore che --version non è documentata da nessuna parte.

+1

"non mi piaceva la soluzione accettata" - solo per i posteri, questo si riferiva originariamente alla risposta di Morgan (http://stackoverflow.com/a/22809973/528044). –