2010-08-27 12 views
7

J'ai un script Ruby basé sur thor, mais je veux le déployer comme une gemme dans les répertoires bin que les gens peuvent frapper sans avoir à faire thor mytool.Possible d'appeler un script exécutable Thor sans appeler thor?

Ainsi, au lieu qu'ils venaient juste utiliser mytool

Est-ce possible?

Je sais que c'est possible avec la vanille optparse mais je préfère utiliser Thor si possible.

Mise à jour: Voici le code que je utilise basé sur l'exemple sur la page Thor, mais je reçois l'erreur suivante:

#!/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 

Erreur:

 
/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 

Répondre

12

Faire la ligne tralala

#!/usr/bin/env ruby 

puis à la fin de votre script ajouter

App.start 
+0

Cela fonctionne très bien. Résumé: appelle le fichier, le rend exécutable, change la ligne bang pour utiliser Ruby comme ci-dessus, ajoute App.start à la fin. Gagner! –

+0

Où est-ce documenté? J'ai dû chercher des exemples sur l'ensemble du net pour comprendre l'astuce de shebang-start. –

+2

Ce n'est pas vraiment. Le shebang est la manière standard de créer des scripts exécutables. La méthode de classe "start" qui est mélangée dans votre sous-classe Thor est documentée sur http://rdoc.info/gems/thor/0.14.6/Thor/Base/ClassMethods:start. Je suis d'accord, en général, que la documentation de Thor est un peu inégale. – Simon

0

Rendre le script exécutable

chmod +x mytool 

et faites #!/usr/bin/env thor la première ligne en mytool.

+0

J'ai essayé cette suggestion, c'était bon mais maintenant j'ai l'erreur que j'ai ajoutée à la question. –

+0

Cela semble être un problème distinct, plus spécifique à votre code et thor. Peut-être devriez-vous ouvrir une nouvelle question plus appropriée à ce nouveau problème? – adamse

1

Vous pouvez trouver ce utile: https://github.com/lastobelus/cleanthor

Je voulais avoir une base thor- exécutable pour une gemme, avec des sous-commandes namespaced, mais organisez les fichiers de tâches en fonction du gyro ruby ​​normal lib/mygem/* / Structure .rb.