在Ruby中,我可以使用require_relative "file.rb"
但是为什么我能够在一个随机的Ruby文件中编写require 'rspec'
并让它确切地知道我指的是哪个文件?
我理解(在阅读this帖后)在rails require中使用$ LOAD_PATH来查找文件路径,但我没看到它在某个任意目录中的工作原理。
答案 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'