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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top