为什么我需要$ LOAD_PATH之外的宝石

时间:2014-05-17 17:42:42

标签: ruby gem rvm

我在我的rvm宝石集coffee-cup中安装了一个宝石ruby-2.1.1@test,其路径为/Users/dingxijin/.rvm/gems/ruby-2.1.1@test/gems/coffee-cup-0.0.4

然后我打开irb,就像这样:

2.1.1 :001 > puts $:
/Users/dingxijin/.rvm/rubies/ruby-2.1.1/lib/ruby/site_ruby/2.1.0
/Users/dingxijin/.rvm/rubies/ruby-2.1.1/lib/ruby/site_ruby/2.1.0/x86_64-darwin12.0
/Users/dingxijin/.rvm/rubies/ruby-2.1.1/lib/ruby/site_ruby
/Users/dingxijin/.rvm/rubies/ruby-2.1.1/lib/ruby/vendor_ruby/2.1.0
/Users/dingxijin/.rvm/rubies/ruby-2.1.1/lib/ruby/vendor_ruby/2.1.0/x86_64-darwin12.0
/Users/dingxijin/.rvm/rubies/ruby-2.1.1/lib/ruby/vendor_ruby
/Users/dingxijin/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0
/Users/dingxijin/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/x86_64-darwin12.0
 => nil
2.1.1 :002 > require "coffee-cup"
NameError: uninitialized constant CoffeeCup::Rails
    from /Users/dingxijin/.rvm/gems/ruby-2.1.1@test/gems/coffee-cup-0.0.4/lib/coffee-cup/engine.rb:2:in `<module:CoffeeCup>' ..........

ruby​​是否从$ LOAD_PATH目录中搜索宝石? 为什么我需要coffee-cup,显然$ LOAD_PATH没有其目录?

1 个答案:

答案 0 :(得分:1)

require的原始“正常”行为是您描述它的方式:LOAD_PATH搜索所请求的文件,如果找不到,则会引发LOAD_ERROR。 Rubygems通过replacing the Kernel#require method修改此行为。对新require方法的评论解释了会发生什么:

  

当需要RubyGems时,Kernel#require将替换为我们自己的   能够根据需要装载宝石。

     

当您致电require 'x'时,会发生以下情况:

     
      
  • 如果文件可以从现有的Ruby加载路径加载,那么   是
  •   
  • 否则,将搜索已安装的gem以查找匹配的文件。   如果它在宝石'y'中找到,则该宝石被激活(添加到   loadpath)。
  •   
     

返回false if的正常require功能   已保存该文件。

默认情况下,Ruby中包含Rubygems,这种新行为现在已成为常态。

在您的示例中,如果在需要gem中的文件后再次查看加载路径,则应该看到已添加了gem的路径。