如何要求rubygems帮助找到rubygem文件?
在尝试解决irb中发现的Gem时,不是在Ruby中 ,我试着看看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", "/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", "."]
如果要求rubygems不修改$:
,那么它如何帮助查找文件? 是monkeypatch require
吗? 如果是这样,它使用什么变量来查找安装了rubygem的库?
以下是相关来源的当前版本: https : //github.com/rubygems/rubygems/blob/02ead548e38ff90923444fa7c0ff9f6a5dbd87b0/lib/rubygems/custom_require.rb 。 (编辑: 这是一个早期版本(1.5.2) ,更清楚地表达了会发生什么。)
文档说:
当需要RubyGems时,
Kernel#require
将替换为我们自己的,可以根据需要加载gem。当您调用
require 'x'
,会发生以下情况:
- 如果可以从现有的Ruby加载路径加载文件,那么它就是。
- 否则,将搜索已安装的gem以查找匹配的文件。 如果它在gem’y’中找到,则激活该gem(添加到加载路径中)。
正常
require
返回false的function,如果已经加载了该文件,则保留该function。
它通过打开module Kernel
并使用alias gem_original_require require
对原始需求进行alias gem_original_require require
,然后重新定义require
首先调用原始版本,并查看gems是否不起作用来实现此目的。
因此,只有在需要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