【问题标题】:Are ruby command line switches -rubygems & -r incompatible?ruby 命令行开关 -rubygems & -r 不兼容吗?
【发布时间】:2008-09-23 21:31:24
【问题描述】:

我最近将一个 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​​ 本身来说同样失败:

  $ 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,但我不喜欢不必要地污染命令行命名空间

【问题讨论】:

    标签: ruby rubygems


    【解决方案1】:

    -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 中以冒号分隔,在 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"
    

    【讨论】:

    • 你是对的(观察 ruby​​/site_ruby/1.8 中的 'ubygems.rb'),但是为什么它会因 2 要求而失败?它会改变加载路径还是什么?
    • 这里需要 -rubygems 开关吗?我可以在没有 -rubygems 开关的情况下指定 -r MyHelpfulClass 吗?
    【解决方案2】:

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

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

    它与irb 一起工作的原因是irb 确实关注$LOAD_PATH 的变化。

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

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

    如果你使用迭代器,痛苦不会随着库的数量线性增加:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-28
      • 2016-06-11
      • 2018-03-15
      • 1970-01-01
      • 1970-01-01
      • 2013-02-21
      • 2021-10-20
      相关资源
      最近更新 更多