6

我最近将一个 ruby​​ 库转换为 gem,这似乎破坏了命令行的可用性

作为图书馆工作得很好

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

作为 gem,irb 知道如何从命令行开关中要求 gem

  $ 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"

或者有没有办法让两个开关工作?

注意:我知道 gem 可以为每个有用的方法添加一个 bin/program,但我不喜欢不必要地污染命令行命名空间

4

2 回答 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 quire 指令。

作为一个稍微不那么难看的解决方法,您可以向 ruby​​ 库搜索路径添加其他项目(在 *nix 中以冒号分隔,在 Windows 中以分号分隔)。

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"
于 2008-09-23T21:39:03.747 回答
0

注意:ruby 1.8 存在此问题,但在 ruby​​ 1.9 中已解决。

在 1.8 上,如果您通过 指定两个库-r,ruby 将尝试加载每个库而不注意$LOAD_PATH. 但是 ruby $LOAD_PATH​​gems 确实发生了变化,因此可以找到宝石。

它使用的原因irb是它irb 确实关注$LOAD_PATH变化。

不幸的是,我发现最好的解决方法是使用更详细的形式:

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

但是,如果您使用迭代器,疼痛不会随着库的数量线性增加:

ruby -rubygems -e '%w(rake rspec).each{|r| require r }'
于 2013-01-04T19:48:28.763 回答