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.