2010-08-27 12 views
7

Tengo un script de Ruby basado en thor, pero quiero implementarlo como una gema en los directorios de personas bin que las personas pueden pulsar sin tener que hacer thor mytool.¿Es posible llamar a script ejecutable Thor-powered sin llamar a thor?

Así que en lugar que acababan de utilizar mytool

es esto posible?

Sé que es posible con vanilla optparse pero prefiero usar Thor si es posible.

Actualización: Este es el código que estoy usando basada en el ejemplo en la página de Thor, pero me sale el siguiente error:

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

error:

 
/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 

Respuesta

12

hacer la línea shebang

#!/usr/bin/env ruby 

y luego, al final de su script añadir

App.start 
+0

Esto funciona genial. Resumen: llame al archivo, haga que sea ejecutable, cambie la línea de marcación para usar Ruby como se indica arriba, agregue App.start hasta el final. ¡Ganar! –

+0

¿Dónde está esto documentado? Tuve que buscar ejemplos en toda la red para descubrir el truco de inicio de shebang. –

+2

No es realmente. El shebang es la forma estándar de crear scripts ejecutables. El método de clase "inicio" que se mezcla en su subclase Thor está documentado en http://rdoc.info/gems/thor/0.14.6/Thor/Base/ClassMethods:start. Estoy de acuerdo, en general, en que la documentación de Thor es un poco irregular. – Simon

0

Hacer el script ejecutable

chmod +x mytool 

y haga #!/usr/bin/env thor la primera línea en mytool.

+0

Intenté esta sugerencia, estaba bien, pero ahora tengo el error que agregué a la pregunta. –

+0

Esto parece ser un problema aparte, más específico para su código y thor. ¿Tal vez debería abrir una nueva pregunta más adecuada para este nuevo problema? – adamse

1

Usted puede encontrar útil esta información: https://github.com/lastobelus/cleanthor

quería tener un thor-basado ejecutable para una gema, con subcomandos de espacio de nombres, pero organizar los archivos de la tarea de acuerdo con la gema ruby ​​normal lib/mygem/* / .rb estructura.

Cuestiones relacionadas