2014-05-17 106 views
2

我在我的rvm寶石套裝中安裝了一塊寶石coffee-cup,其路徑爲/Users/dingxijin/.rvm/gems/[email protected]/gems/coffee-cup-0.0.4,其中[email protected]

然後我打開IRB,就像這樣:從$ LOAD_PATH目錄

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/[email protected]/gems/coffee-cup-0.0.4/lib/coffee-cup/engine.rb:2:in `<module:CoffeeCup>' .......... 

是否紅寶石搜索寶石? 爲什麼我需要coffee-cup,顯然$ LOAD_PATH沒有它的目錄?

回答

1

原來,「正常」的require行爲是你如何描述的那樣:LOAD_PATH中搜索請求的文件,如果它沒有找到一個LOAD_ERROR提高。 Rubygems通過replacing the Kernel#require method修改此行爲。新require方法的註釋說明會發生什麼:

當需要RubyGems的,內核#需要替換爲我們自己的這 能夠按需加載的寶石。

當你調用require 'x',這是發生了什麼:

  • 如果文件可以從現有的Ruby loadpath被加載,它 是。
  • 否則,搜索已安裝的寶石以查找匹配的文件。 如果在gem'y'中找到該寶石,則激活該寶石(添加到 加載路徑中)。

正常require如果 文件已被加載,則返回false的功能將被保留。

Ruby默認情況下包含在Ruby中,現在這種新行爲是常態。

在您的示例中,如果您在從一個gem中需要一個文件後再次查看加載路徑,您應該會看到添加了該gems的路徑。

+0

非常感謝。我已經搜索了很多,沒有人談論這個。我認爲紅寶石需要努力改進他們的文檔。 –

相關問題