红宝石没有添加宝石的路径

时间:2014-03-08 13:34:04

标签: ruby rake rvm

我用:

  1. rvm 1.25.19(稳定)
  2. ruby​​ 1.9.3p545
  3. 我安装了gem rake命令

    gem install rake
    

    我知道$ LOAD_PATH应包含路径:

    ~/.rvm/rubies/ruby1.9/gems/rake/lib
    ~/.rvm/rubies/ruby1.9/gems/rake/bin
    

    我执行命令:

    ruby -e 'puts $LOAD_PATH'
    

    输出:

    /home/slip/.rvm/rubies/ruby-1.9.3-p545/lib/ruby/site_ruby/1.9.1
    /home/slip/.rvm/rubies/ruby-1.9.3-p545/lib/ruby/site_ruby/1.9.1/x86_64-linux
    /home/slip/.rvm/rubies/ruby-1.9.3-p545/lib/ruby/site_ruby
    /home/slip/.rvm/rubies/ruby-1.9.3-p545/lib/ruby/vendor_ruby/1.9.1
    /home/slip/.rvm/rubies/ruby-1.9.3-p545/lib/ruby/vendor_ruby/1.9.1/x86_64-linux
    /home/slip/.rvm/rubies/ruby-1.9.3-p545/lib/ruby/vendor_ruby
    /home/slip/.rvm/rubies/ruby-1.9.3-p545/lib/ruby/1.9.1
    /home/slip/.rvm/rubies/ruby-1.9.3-p545/lib/ruby/1.9.1/x86_64-linux
    

    为什么宝石'耙'的路径不添加?

1 个答案:

答案 0 :(得分:2)

在Ruby中安装gem不会自动将该gem文件添加到加载路径。当您require文件时,首先搜索现有的加载路径,如果找不到匹配的文件,则Rubygems会在已安装的gems中搜索该文件。如果找到了这样的gem,则激活,这是将gem的lib目录添加到加载路径时。

以下是使用Haml gem的示例:

puts "Before:"
puts $LOAD_PATH
puts

require 'haml'
puts "After:"
puts $LOAD_PATH

这会产生:

Before:
/Users/matt/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/site_ruby/1.9.1
/Users/matt/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/site_ruby/1.9.1/x86_64-darwin10.8.0
/Users/matt/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/site_ruby
/Users/matt/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/vendor_ruby/1.9.1
/Users/matt/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/vendor_ruby/1.9.1/x86_64-darwin10.8.0
/Users/matt/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/vendor_ruby
/Users/matt/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1
/Users/matt/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/x86_64-darwin10.8.0

After:
/Users/matt/.rvm/gems/ruby-1.9.3-p448/gems/tilt-1.4.1/lib
/Users/matt/.rvm/gems/ruby-1.9.3-p448/gems/haml-4.0.5/lib
/Users/matt/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/site_ruby/1.9.1
/Users/matt/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/site_ruby/1.9.1/x86_64-darwin10.8.0
/Users/matt/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/site_ruby
/Users/matt/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/vendor_ruby/1.9.1
/Users/matt/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/vendor_ruby/1.9.1/x86_64-darwin10.8.0
/Users/matt/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/vendor_ruby
/Users/matt/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1
/Users/matt/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/x86_64-darwin10.8.0

了解如何将Tilt的lib目录(Haml的依赖关系)和Haml添加到加载路径的开头。

对于某些宝石,例如Rake,由于它们是标准库的一部分,所以它已经在加载路径上,这很复杂。如果您更改了上面的示例以使用require 'rake',那么您将看不到加载路径中的任何更改。在这种情况下,您可以指定要使用带有gem方法的gem版本。这会激活有问题的gem,将其lib目录放在加载路径的开头,以便稍后调用require时,您将加载正确的版本。

例如,这个脚本

require 'rake'
puts Rake::VERSION

使用Ruby 1.9.3生成0.9.2.2,因为它是标准库中包含的Rake版本。不过这个脚本:

gem 'rake'
require 'rake'
puts Rake::VERSION

生成10.1.1,因为这是我系统上安装的Rake gem的当前最高版本。您还可以通过向gem提供第二个参数来指定特定的gem版本(这与Gemfiles中使用的语法相同)。请注意,gem方法 require任何文件,您必须单独执行此操作。