【问题标题】:How does require rubygems help find rubygem files?require ruby​​gem 如何帮助查找 ruby​​gem 文件?
【发布时间】:2011-05-30 23:52:04
【问题描述】:

在尝试解决 Gem found in irb, not in 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", "."]

如果要求 ruby​​gems 不修改 $:,那么它如何帮助查找文件?它是猴子补丁require 吗?如果是这样,它使用什么变量来查找 ruby​​gem 安装的库?

【问题讨论】:

    标签: ruby rubygems


    【解决方案1】:

    这是相关来源的当前版本:https://github.com/rubygems/rubygems/blob/02ead548e38ff90923444fa7c0ff9f6a5dbd87b0/lib/rubygems/custom_require.rb。 (编辑:here's an earlier version (1.5.2) 更清楚地表达了发生的事情。)

    文档说:

    当需要 RubyGems 时,Kernel#require 替换为我们自己的 能够按需加载宝石。

    当您致电require 'x' 时,会发生以下情况:

    • 如果文件可以从现有的 Ruby 加载路径加载,它 是。
    • 否则,将在已安装的 gem 中搜索匹配的文件。 如果在 gem 'y' 中找到它,则该 gem 被激活(添加到 加载路径)。

    正常的require 功能返回 false if 已经加载的文件被保留。

    它通过打开 module Kernel 并将原始 require 别名为 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 
    

    【讨论】:

    • 你知道它使用什么变量吗?
    • @Andrew Gem.path 可能就是您想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 2011-07-17
    • 1970-01-01
    • 2011-04-25
    • 2012-06-12
    • 2014-03-01
    • 1970-01-01
    相关资源
    最近更新 更多