在尝试解决在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", "."]
Run Code Online (Sandbox Code Playgroud)
如果请求rubygems不修改$:,那么它如何帮助查找文件?它是monkeypatch require吗?如果是这样,它使用什么变量来查找rubygem安装的库?
mat*_*att 13
以下是相关来源的当前版本:https://github.com/rubygems/rubygems/blob/02ead548e38ff90923444fa7c0ff9f6a5dbd87b0/lib/rubygems/custom_require.rb.(编辑:这是一个早期版本(1.5.2),更清楚地表达了会发生什么.)
文档说:
当需要RubyGems时,
Kernel#require将替换为我们自己的RubyGems,它能够按需加载gem.当你打电话时
require 'x',会发生这种情况:
- 如果可以从现有的Ruby加载路径加载文件,那么它就是.
- 否则,将搜索已安装的gem以查找匹配的文件.如果它在gem'y'中找到,则激活该gem(添加到loadpath).
require如果已经加载了该文件,则保留返回false 的正常功能.
它通过打开module Kernel和别名原始需求alias gem_original_require require,然后重新定义require以首先调用原始版本,并查看宝石,如果这不起作用.
因此,只有在需要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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2057 次 |
| 最近记录: |