0

我对 Rubygem 产生了兴趣,并开始探索它是如何工作的,发现在 1.9 之后,Rubygemrequire变成了 THE require.

使用以下代码:

require 'debugger'
debugger
require 'thor'

我开始nand land s,但被困在:

  # specification.rb:263
  def self._all # :nodoc:
    unless defined?(@@all) && @@all then
      specs = {}

      self.dirs.each { |dir|
        Dir[File.join(dir, "*.gemspec")].each { |path|
          spec = Gem::Specification.load path.untaint
          # #load returns nil if the spec is bad, so we just ignore
          # it at this stage
          specs[spec.full_name] ||= spec if spec
        }
      }

      @@all = specs.values

      _resort!
    end
    @@all
  end

看来在踏入上面的方法之前,@@all已经做好了准备。然后我到处设置断点@@all =,但没有一个断点到达。

我错过了什么???


编辑:

再看看我的问题。看到了require 'debugger'吗?我觉得自己像个傻瓜。

现在的问题是“我该如何调试require


关闭:

请看这个很好的答案:https ://stackoverflow.com/a/16069229/342366

4

1 回答 1

0

再次感谢这个问候答案:https ://stackoverflow.com/a/16069229/342366 ,我自己做了一些调试。

对于这个问题的一些谷歌(并且懒得调试),我决定将答案发布到“Rubygem 如何需要所有宝石?”

有以下关键步骤:

  1. 在“Ruby193\lib\ruby\gems\1.9.1\specifications”中加载所有“.gemspec”

    Dir[File.join(dir, "*.gemspec")].each { |path|
      spec = Gem::Specification.load path.untaint
      # #load returns nil if the spec is bad, so we just ignore
      # it at this stage
      specs[spec.full_name] ||= spec if spec
    }
    
  2. 按版本 desc 对 gem 进行排序

    @@all.sort! { |a, b|
      names = a.name <=> b.name
      next names if names.nonzero?
      b.version <=> a.version
    }
    
  3. 得到第一个宝石(更高版本)

    self.find { |spec|
      spec.contains_requirable_file? path
    }
    
  4. 激活 gem 和所有依赖项~ 大家都很开心。

于 2013-04-22T13:02:53.940 回答