2016-12-01 2 views
3

В Ruby я могу потребовать другой файл, используя относительный путь с require_relative "file.rb"Как рубин знать, где найти RSpec в требуют «RSpec»

Но как прийти я могу написать require 'rspec' в случайном файл Ruby, и имею он точно знает, к какому файлу я имею в виду?

Я понимаю (после чтения this сообщение), что в rails требуется работать с $ LOAD_PATH, чтобы найти путь к файлу, но я не вижу, как он работает в каком-то произвольном каталоге.

ответ

4

This post объясняет это в деталях. Вот важные бит:

Чтобы помочь вам использовать код внутри ваших драгоценных камней, RubyGems переопределяет требуемый метод Ruby. (Он делает это в 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.

0

Если вы используете RubyGems или gem install для установки Gems на свой компьютер, require будет использовать RubyGems, чтобы найти путь Gem, который вы установили на свой компьютер.

Вот простой скрипт, используя Byebug драгоценный камень, чтобы исследовать, как он решает путь RSpec:

require 'byebug' 

byebug 
require 'rspec' 
Смежные вопросы