Como devo estruturar meu serviço de linha de comando Ruby Gem?
-
10-12-2019 - |
Pergunta
Estou escrevendo uma jóia Ruby que os usuários podem instalar e usar a ferramenta Ruby de linha de comando para interagir com o serviço.Você pode iniciar e parar o serviço (isso gerará um processo filho).
Eu fiz muitas pesquisas sobre as melhores coisas para escrever um serviço de rede, como ØMQ/EventMachine e aprendi como criar uma gem Ruby que instalará um binário que você pode usar na linha de comando, mas eu' Estou lutando para definir uma boa estrutura de código.
Meu utilitário de linha de comando aceitará vários argumentos (usarei Trollop) e usará várias classes para fazer coisas e usará várias outras gemas de rubi.
Não tenho certeza de onde devo colocar meus arquivos de classe e como exigi-los em meu binário para que os caminhos estejam corretos.
Solução
Em grande parte, RubyGems cuidará disso para você.Você precisará incluir seu executável no files
lista e coloque-o no executables
em seu gemspec.É comum colocar seu executável em bin
em seu diretório, por exemplo:
$ ls
bin/ myapp.gemspec lib/ Rakefile
$ ls bin
bin/myapp
Seu gemspec ficaria assim:
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
Neste ponto, quando os usuários instalam seu aplicativo via RubyGems, myapp
estará em seu caminho, e lib
estará no caminho de carregamento do seu aplicativo, então seu executável pode simplesmente começar com:
#!/usr/bin/env ruby
require 'myapp'
# whatever other requires
O único problema com isso é que, durante o desenvolvimento, você não pode simplesmente fazer bin/myapp
e execute seu aplicativo.Alguns desenvolvedores manipulam o caminho de carregamento via $:
ou $LOAD_PATH
, mas isso é considerado uma má forma.
Se você estiver usando o bundler, é mais fácil executar seu aplicativo localmente com bundle exec
, por exemplo. bundle exec bin/myapp
.Você pode alternativamente usar o RUBYLIB
variável de ambiente, por ex. RUBYLIB=lib bin/myapp
, que colocará lib
no caminho de carga.
Outras dicas
Você pode gerar uma estrutura de projeto gem com Empacotador.
Brevemente:
Instalar o pacote
$ gem install bundler
Use o Bundler para gerar o projeto gem
$ bundle gem myapp
$ cd myapp
Adicione um executável
$ mkdir bin
$ cat > bin/mycommand << EOSCRIPT
#!/usr/bin/env ruby
require 'myapp'
puts "Executing myapp"
EOSCRIPT
$ chmod +x bin/mycommand
Instale sua joia
$ rake install
Execute seu script
$ mycommand
Executing mycommand
Compartilhe seu utilitário em rubygems.org
$ rake release
Mais documentos em o site
Como todas as joias são de código aberto por natureza, você sempre pode dar uma olhada em algumas das melhores para obter exemplos.Usando um construtor de gemas como jeweler
ou hoe
também prepararia para você algumas das estruturas básicas do ponto de vista organizacional.