问题描述
|
在尝试解决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