tutorial rails programa ejecutar comandos aprender ruby thor

rails - Espacios de nombres thor comandos en un ejecutable ruby independiente



ruby tutorial (2)

Al llamar a los comandos thor en la línea de comandos, los métodos están separados por su estructura de módulo / clase, por ejemplo

class App < Thor desc ''hello'', ''prints hello'' def hello puts ''hello'' end end

se ejecutaría con el comando

thor app:hello

Sin embargo, si haces ese auto ejecutable poniendo

App.start

en la parte inferior puede ejecutar el comando como:

app hello

¿Hay alguna forma de espacio de nombres esos comandos? Para que pudieras llamar, por ejemplo.

app say:hello app say:goodbye


Esta es una forma con la aplicación como espacio de nombres predeterminado (aunque bastante intrépido):

#!/usr/bin/env ruby require "rubygems" require "thor" class Say < Thor # ./app say:hello desc ''hello'', ''prints hello'' def hello puts ''hello'' end end class App < Thor # ./app nothing desc ''nothing'', ''does nothing'' def nothing puts ''doing nothing'' end end begin parts = ARGV[0].split('':'') namespace = Kernel.const_get(parts[0].capitalize) parts.shift ARGV[0] = parts.join namespace.start rescue App.start end

O, también, no ideal:

define_method ''say:hello''


Otra forma de hacer esto es usar el registro:

class CLI < Thor register(SubTask, ''sub'', ''sub <command>'', ''Description.'') end class SubTask < Thor desc "bar", "..." def bar() # ... end end CLI.start

Ahora, asumiendo que su ejecutable se llama foo, puede llamar a:

$ foo sub bar

Sin embargo, en la versión actual de thor (0.15.0.rc2) hay un error que hace que los textos de ayuda omitan el espacio de nombres de los subcomandos:

$ foo sub Tasks: foo help [COMMAND] # Describe subcommands or one specific subcommand foo bar #

Puedes arreglar eso al reemplazar self.banner y establecer explícitamente el espacio de nombres.

class SubTask < Thor namespace :sub def bar ... def self.banner(task, namespace = true, subcommand = false) "#{basename} #{task.formatted_usage(self, true, subcommand)}" end end

El segundo parámetro de formatted_usage es la única diferencia con respecto a la implementación original del banner. También puede hacer esto una vez y hacer que otras clases de subcomandos heredados de SubTask. Ahora tienes:

$ foo sub Tasks: foo sub help [COMMAND] # Describe subcommands or one specific subcommand foo sub bar #

Espero que ayude.