代码之家  ›  专栏  ›  技术社区  ›  Purfideas

ruby命令行开关-rubygems&-r是否不兼容?

  •  6
  • Purfideas  · 技术社区  · 17 年前

    我最近将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/程序,但我不想不必要地污染命令行命名空间

    2 回复  |  直到 17 年前
        1
  •  7
  •   JasonTrue    17 年前

    -rubygems实际上与-r ubygem相同。

    据我所知,它不会打乱你的搜索路径,但我认为它也不会给你的-r搜索路径增加任何东西。我能够做这样的事情:

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

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

    这有点糟糕,但它至少表明你可以有多个要求指令。

    作为一种稍微不那么难看的解决方法,您可以在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"
    
        2
  •  0
  •   Kelvin    13 年前

    注意:这个问题在ruby 1.8中存在,但在ruby 1.9中得到了解决。

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

    它工作的原因 irb 是吗 内部评级 注意 $LOAD_PATH 变化。

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

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

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

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