2008-09-23 79 views
6

我最近转换一个Ruby库的宝石,这似乎打破了命令行可用性红宝石命令行开关-rubygems和-r不兼容?

工作的罚款作为一个库

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

而作为宝石,IRB知道如何需要从命令宝石直插式开关

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

但同样未能红宝石本身:

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

我现在必须这样做,这似乎难看:

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

还是有办法让2个开关的工作?

:我知道这个宝石可以为每一个有用的方法添加斌/程序,但我不喜欢污染的命令行命名空间不必要

回答

7

-rubygems其实是一样的-r ubygems。

它不惹你的搜索路径,据我理解,但我认为它不会给你-r搜索路径添加任何东西要么。我能够这样做:

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

MyHelpfulClass.rb存在于上面指定的lib目录中。

那种很烂,但至少证明了你可以有多个-r equire指令。

作为一个略少丑的解决方法,您可以添加其他项目的Ruby库搜索路径(冒号* nix的分隔,分号分隔的窗户)。

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

如果你不想与环境变量一塌糊涂,你可以添加一些负载路径自己:

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

你是对的(观察ruby/site_ruby/1.8中的'ubygems.rb'),但是为什么它会在2需求失败?它会改变负载路径吗? – 2008-09-23 21:44:43

0

注:存在红宝石1.8这个问题,但在解决红宝石1.9。

在1.8上,如果您通过-r指定了两个库,ruby会尝试加载每个库而不关注$LOAD_PATH中的更改。但rubygems确实会改变$LOAD_PATH,所以可以找到宝石。

它与irb的原因是irb确实讲究$LOAD_PATH变化。

不幸的是,我已经找到了最好的解决方法是使用更详细的形式:

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

疼痛没有线性库数量的增加不过,如果你使用一个迭代:

ruby -rubygems -e '%w(rake rspec).each{|r| require r }'