2010-08-27 7 views
7

Ich habe ein thor-basiertes Ruby-Skript, aber ich möchte es als ein Juwel in den bin-Verzeichnissen von Leuten einsetzen, die Leute treffen können, ohne thor mytool zu tun.Möglich, ausführbares Thor-powered-Skript ohne Aufruf von thor aufzurufen?

Anstatt also würden sie verwenden nur mytool

Ist das möglich?

Ich weiß, es ist möglich mit Vanille optparse, aber ich würde lieber Thor wenn möglich verwenden.

Update: Dies ist der Code, den ich auf der Thor-Seite auf dem Beispiel basiert bin mit, aber ich habe den Fehler unten:

#!/usr/bin/env thor 

class App < Thor 
    map "-L" => :list 

    desc "install APP_NAME", "install one of the available apps" 
    method_options :force => :boolean, :alias => :string 
    def install(name) 
    user_alias = options[:alias] 
    if options.force? 
     # do something 
    end 
    # other code 
    end 

    desc "list [SEARCH]", "list all of the available apps, limited by SEARCH" 
    def list(search="") 
    # list everything 
    end 
end 

Fehler:

 
/usr/lib/ruby/gems/1.8/gems/thor-0.14.0/lib/thor/runner.rb:34:in `method_missing': undefined method `start' for nil:NilClass (NoMethodError) 
     from /usr/lib/ruby/gems/1.8/gems/thor-0.14.0/lib/thor/task.rb:22:in `send' 
     from /usr/lib/ruby/gems/1.8/gems/thor-0.14.0/lib/thor/task.rb:22:in `run' 
     from /usr/lib/ruby/gems/1.8/gems/thor-0.14.0/lib/thor/task.rb:108:in `run' 
     from /usr/lib/ruby/gems/1.8/gems/thor-0.14.0/lib/thor/invocation.rb:118:in `invoke_task' 
     from /usr/lib/ruby/gems/1.8/gems/thor-0.14.0/lib/thor.rb:246:in `dispatch' 
     from /usr/lib/ruby/gems/1.8/gems/thor-0.14.0/lib/thor/base.rb:389:in `start' 
     from /usr/lib/ruby/gems/1.8/gems/thor-0.14.0/bin/thor:6 
     from /usr/bin/thor:19:in `load' 
     from /usr/bin/thor:19 

Antwort

12

Sprechen Sie die Shebang-Zeile

#!/usr/bin/env ruby 

und dann am Ende des Skriptes

App.start 
+0

Das funktioniert großartig. Zusammenfassung: Rufen Sie die Datei wie auch immer auf, machen Sie sie ausführbar, ändern Sie die Bang-Zeile, um Ruby wie oben zu verwenden, fügen Sie App.start zum Ende hinzu. Sieg! –

+0

Wo ist das dokumentiert? Ich musste im ganzen Netz nach Beispielen suchen, um den Shebang-Start-Trick herauszufinden. –

+2

Es ist nicht wirklich. Der Shebang ist die Standardmethode zum Erstellen ausführbarer Skripts. Die Klassenmethode "start", die in Ihre Thor-Unterklasse eingemischt wird, ist unter http://rdoc.info/gems/thor/0.14.6/Thor/Base/ClassMethods:start dokumentiert. Ich stimme im Allgemeinen zu, dass Thors Dokumentation ein wenig unpassend ist. – Simon

0

Machen Sie das Skript ausführbar

chmod +x mytool 

und machen #!/usr/bin/env thor die erste Zeile in mytool.

+0

Ich habe diesen Vorschlag versucht, es war gut, aber jetzt habe ich den Fehler, dass ich die Frage hinzugefügt. –

+0

Dies scheint ein separates Problem zu sein, genauer gesagt für Sie Code und Thor. Vielleicht sollten Sie eine neue Frage öffnen, die für dieses neue Problem passender ist? – adamse

1

hinzufügen können Sie diese hilfreich finden: https://github.com/lastobelus/cleanthor

ich eine thor-basierte haben wollte ausführbar für ein Juwel, mit namespaced Unterbefehle, sondern organisieren Sie die Aufgabendateien nach dem normalen Rubin gem lib/mygem/* / .rb Struktur.

Verwandte Themen