São linha de comando ruby ??interruptores -rubygems & -r incompatíveis?
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 ??em>: 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
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 }'