¿Cómo debo estructurar mi servicio de línea de comandos Ruby Gem?
-
10-12-2019 - |
Pregunta
Estoy escribiendo una gema Ruby que los usuarios pueden instalar y usar la herramienta Ruby de línea de comandos para interactuar con el servicio.Puede iniciar y detener el servicio (generará un proceso secundario).
He investigado mucho sobre las mejores cosas que se pueden usar para escribir un servicio de red, como ØMQ/EventMachine y entendí cómo crear una gema Ruby que instalará un binario que puedes usar en la línea de comando, pero no Estoy luchando por establecer una buena estructura de código.
Mi utilidad de línea de comando tomará varios argumentos (usaré Ramera) y usará varias clases para hacer cosas y usará otras gemas de rubí.
No estoy seguro de dónde debo colocar mis archivos de clase y cómo solicitarlos en mi binario para que las rutas sean correctas.
Solución
En gran medida, RubyGems se encargará de esto por usted.Deberá incluir su ejecutable en el files
lista y colóquelo en el executables
en tu especificación de gemas.Es común poner su ejecutable en bin
en su directorio, por ejemplo:
$ ls
bin/ myapp.gemspec lib/ Rakefile
$ ls bin
bin/myapp
Su gemspec entonces se vería así:
Gem::Specification.new do |s|
s.name = 'myapp'
# whatever else is in your gemspec
s.files = ["bin/myapp","lib/myapp.rb"] # or whatever other files you want
s.executables = ["bin/todo"]
end
En este punto, cuando los usuarios instalan su aplicación a través de RubyGems, myapp
estará en su camino, y lib
estará en la ruta de carga de su aplicación, por lo que su ejecutable puede simplemente comenzar con:
#!/usr/bin/env ruby
require 'myapp'
# whatever other requires
El único problema con esto es que, durante el desarrollo, no puedes simplemente hacer bin/myapp
y ejecute su aplicación.Algunos desarrolladores manipulan la ruta de carga mediante $:
o $LOAD_PATH
, pero esto se considera de mala educación.
Si está utilizando el paquete, es más fácil ejecutar su aplicación localmente con bundle exec
, p.ej. bundle exec bin/myapp
.Alternativamente puede utilizar el RUBYLIB
variable de entorno, p.e. RUBYLIB=lib bin/myapp
, que pondrá lib
en el recorrido de carga.
Otros consejos
Puede generar una estructura de proyecto de gema con Bundler .
brevemente:
instalar bundler
$ gem install bundler
use Bundler para generar el proyecto GEM
$ bundle gem myapp
$ cd myapp
Agregar un ejecutable
$ mkdir bin
$ cat > bin/mycommand << EOSCRIPT
#!/usr/bin/env ruby
require 'myapp'
puts "Executing myapp"
EOSCRIPT
$ chmod +x bin/mycommand
instale su gema
$ rake install
Ejecute su script
$ mycommand
Executing mycommand
Comparte tu utilidad en rubygems.org
$ rake release
Más documentos en el sitio web
Dado que todas las gemas son de origen abierto por naturaleza, siempre puedes echar un vistazo a algunos de los mejores para ejemplos.El uso de un constructor de gemas, como jeweler
o hoe
, también lo preparará con algunas de las estructuras básicas que hablan organizativamente.