红宝石如何知道在哪里找到rspec in require“rspec”

时间:2016-12-01 02:34:13

标签: ruby rspec

在Ruby中,我可以使用require_relative "file.rb"

的相对路径来要求另一个文件

但是为什么我能够在一个随机的Ruby文件中编写require 'rspec'并让它确切地知道我指的是哪个文件?

我理解(在阅读this帖后)在rails require中使用$ LOAD_PATH来查找文件路径,但我没看到它在某个任意目录中的工作原理。

2 个答案:

答案 0 :(得分:4)

This post详细解释。这是重要的一点:

  

为了帮助您使用gem中的代码,RubyGems会覆盖Ruby的require方法。 (它在core_ext/kernel_require.rb中执行此操作)。评论很清楚:

 ##
  # When RubyGems is required, Kernel#require is replaced with our own which
  # is capable of loading gems on demand.
  #
  # When you call <tt>require 'x'</tt>, this is what happens:
  # * If the file can be loaded from the existing Ruby loadpath, it
  #   is.
  # * Otherwise, installed gems are searched for a file that matches.
  #   If it's found in gem 'y', that gem is activated (added to the
  #   loadpath).
  #

这篇文章的其余部分将逐步引导我们完成需求过程,查看代码;但它的要点是,如果原始require(通过$LOAD_PATH)失败,它将扫描所有已安装宝石的规范文件,并查看您的需要是否适用于它;如果是这样,它会激活(添加$LOAD_PATH)该宝石以及它所依赖的所有宝石;最后它会重新调用原来的require

答案 1 :(得分:0)

如果您使用RubyGems或gem install在计算机上安装Gems,require将使用RubyGems查找您计算机上安装的Gem的路径。

这是一个使用Byebug gem探索如何解析Rspec路径的简单脚本:

require 'byebug'

byebug
require 'rspec'