São linha de comando ruby ??interruptores -rubygems & -r incompatíveis?

StackOverflow https://stackoverflow.com/questions/124035

  •  02-07-2019
  •  | 
  •  

Pergunta

Eu recentemente convertido uma biblioteca Ruby para uma jóia, que parecia quebrar a usabilidade linha de comando

Trabalhou bem como uma biblioteca

  $ ruby -r foobar -e 'p FooBar.question' # => "answer"

E, como uma jóia, o IRB sabe como exigir uma jóia de opções de linha de comando

  $ irb -rubygems -r foobar
  irb(main):001:0> FooBar.question # => "answer"

Mas o mesmo falhar por ruby-se:

  $ ruby -rubygems -r foobar -e 'p FooBar.question'
  ruby: no such file to load -- foobar (LoadError)

deve agora fazer isso, o que parece feio:

  ruby -rubygems -e 'require "foobar"; p FooBar.question' # => "answer"

Ou há uma maneira de fazer o 2 alterna trabalho?

Nota : Eu sei que a jóia pode adicionar um bin / programa para cada método útil, mas eu não gosto de poluir a linha de comando namespace desnecessariamente

Foi útil?

Solução

-rubygems é realmente o mesmo que ubygems -r.

Não faz mexer com o seu caminho de pesquisa, tanto quanto eu entendo, mas eu acho que não acrescenta nada ao seu caminho de pesquisa -r também. Eu era capaz de fazer algo parecido com isto:

ruby -rubygems -r /usr/lib/ruby/gems/myhelpfulclass-0.0.1/lib/MyHelpfulClass -e "puts MyHelpfulClass"

MyHelpfulClass.rb existe no diretório lib especificado acima.

Esse tipo de porcaria, mas pelo menos demonstra que você pode ter várias directivas -r equire.

Como solução um pouco menos feio, você pode adicionar itens adicionais para o caminho de busca da biblioteca ruby ??(cólon delimitado em * nix, ponto e vírgula delimitada no windows).

export RUBYLIB=/usr/lib/ruby/gems/1.8/gems/myhelpfulclass-0.0.1/lib
ruby -rubygems -r MyHelpfulClass -e "puts MyHelpfulClass"

Se você não quer mexer com a variável de ambiente, você pode adicionar algo ao caminho de carga se:

ruby -I /usr/lib/ruby/gems/1.8/gems/myhelpfulclass-0.0.1/lib \
   -rubygems -r MyHelpfulClass -e "puts MyHelpfulClass"

Outras dicas

Nota:. Este problema existe para Ruby 1.8, mas é resolvido no Ruby 1.9

No 1.8, se você especificar ambas as libs via -r, rubi tentará carregar cada biblioteca sem prestar atenção às mudanças no $LOAD_PATH. Mas rubygems muda $LOAD_PATH assim as gemas pode ser encontrado.

A razão que trabalha com irb é que irb faz prestar atenção às mudanças $LOAD_PATH.

Infelizmente, a melhor solução que eu encontrei é usar o mais detalhado forma:

ruby -rubygems -e 'require "foobar"; p FooBar.question'

A dor não aumenta linearmente com o número de libs porém, se você usar um iterador:

ruby -rubygems -e '%w(rake rspec).each{|r| require r }'
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top