rubygems如何要求帮助找到rubygem文件?

问题描述

| 在尝试解决irb而非Ruby中发现的Gem时,我尝试查看
require \'rubygems\'
对我自己的安装有什么影响:
$ irb
irb(main):001:0> RUBY_VERSION
=> \"1.8.7\"
irb(main):002:0> $:
[\"/usr/local/lib/site_ruby/1.8\",\"/usr/local/lib/site_ruby/1.8/x86_64-linux\",\"/usr/local/lib/site_ruby\",\"/usr/lib/ruby/vendor_ruby/1.8\",\"/usr/lib/ruby/vendor_ruby/1.8/x86_64-linux\",\"/usr/lib/ruby/vendor_ruby\",\"/usr/lib/ruby/1.8\",\"/usr/lib/ruby/1.8/x86_64-linux\",\".\"]
=> nil
irb(main):003:0> require \"rubygems\" # Hasn\'t been required already
=> true
irb(main):004:0> require \"rubygems\" # Will return false,because it\'s already been required
=> false
irb(main):005:0> $: # Same as before
=> [\"/usr/local/lib/site_ruby/1.8\",\".\"]
如果要求rubygems不会修改
$:
,那么它如何帮助查找文件?猴子补丁
require
吗?如果是这样,它将使用什么变量来查找rubygem安装的库?     

解决方法

        这是相关资源的当前版本:https://github.com/rubygems/rubygems/blob/02ead548e38ff90923444fa7c0ff9f6a5dbd87b0/lib/rubygems/custom_require.rb。 (编辑:这是更早的版本(1.5.2),可以更清楚地说明发生的情况。) 文档说:   当需要RubyGems时,将ѭ4which替换为我们自己的   能够按需装载宝石。      当您呼叫
require \'x\'
时,会发生以下情况:         如果可以从现有的Ruby加载路径加载文件,则它将   是。   否则,将搜索已安装的gem匹配的文件。   如果在宝石“ y”中找到了该宝石,则该宝石被激活(添加到   加载路径)。         正常的
require
功能,如果返回false   该文件已经被加载保留。 它通过打开
module Kernel
并为原始要求加上
alias gem_original_require require
别名,然后重新定义
require
来首先调用原始版本,然后查看那些不能正常工作的gem来做到这一点。 因此,仅在需要gem时才更改加载路径:
ruby-1.8.7-p330 :002 > $:.length
=> 9 
ruby-1.8.7-p330 :003 > require \'rubygems\'
=> true 
ruby-1.8.7-p330 :004 > $:.length
=> 9 
ruby-1.8.7-p330 :005 > require \'haml\'
=> true 
ruby-1.8.7-p330 :006 > $:.length
=> 10