2014-04-02 17 views
10

Wie füge ich eine --version Option zu meiner Ruby Thor Befehlszeilenschnittstelle Anwendung hinzu.Hinzufügen einer --version Option zu einem Ruby Thor CLI

Zum Beispiel möchte ich in der Lage sein

$ thor_app --version 
> thor_app version 1.0.0 

Diese Frage zu Run a CLI Thor app without arguments or task name verwendet ist zu laufen, aber speziell eine --version Option hinzufügen, die keine Aufgabe erfordert.

Hinweis
Dies wurde nach dem self-answer format geschrieben. Zusätzliche Antworten und Aktualisierungen werden empfohlen

Antwort

23

hatte ich etwas Glück mit diesem Ansatz:

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

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

den führenden Unterstrichen wird sichergestellt, da kein Befehl wie yourapp version ist, und Kräfte yourapp --version oder yourapp -v. Der Inhalt desc ermöglicht es, als -v, --version angezeigt werden, ohne __print_version zu exponieren.

+0

Dies ist eine Art von was Bündler tut. nur sie rufen nur die Task-Version auf und lassen sie auch mit 'Bundler-Version 'aufrufen (denn warum nicht?) https://github.com/bundler/bundler/blob/6afa89217cf052c58316da1f2be7bf54749ff9/lib/bundler/cli.rb#L312- L316 – ZombieDev

+2

Dies sollte an die Thor-Entwickler für eine Dokumentation behoben werden. –

1

Die beste Option, die ich bisher gefunden habe, ist, eine boolesche Klassenoption zu erstellen, die nicht zu einer Aufgabe gehört, auf die andere Aufgaben verweisen können. Das häufig verwendete Beispiel für eine Klassenoption ist -v ausführlich, da alle Tasks diese verwenden können, um festzustellen, wie laut sie sein sollten.

Dann erstellen Sie eine 'Version' Aufgabe und machen Sie es zur Standardaufgabe, wenn keine Aufgabe definiert ist, wird die Versionsaufgabe ausgeführt und kann auf das --version Flag (Klassenoption) reagieren.

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

Ich liebte die akzeptierte Lösung nicht; Es endet mit der Auflistung version als einen Befehl, Auflistung --version und --no-version als globale Optionen, und wenn das Skript ohne Optionen ausgeführt wird, ist es leise, anstatt Hilfe zu geben.

Das Beste, was ich habe in der Lage zu kommen mit ist es außerhalb Thor zu tun:

class CLI < Thor 
    . 
    . 
    . 
end 

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

CLI.start 

Dies hat den kleinen Nachteil, dass --version nirgendwo dokumentiert ist.

+1

"Ich habe die akzeptierte Lösung nicht geliebt" - nur für die Nachwelt, dies bezieht sich ursprünglich auf Morgans Antwort (http://stackoverflow.com/a/22809973/528044). –