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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top