Ruby: как "потребовать" файл из текущего рабочего каталога?

Как мне получить файл из текущей папки?

У меня есть файл с именем sql_parser.rb, который содержит класс. Я хочу включить это в другой файл также в ту же папку, поэтому я использовал:

require 'sql_parser'

Это не удается, когда я запускаю из этой папки:

LoadError: no such file to load -- sql_parser

Я попытался использовать IRB в папке, где этот файл существует и требует от него, но имел ту же проблему.

Ответы

Ответ 2

Использование

$:.unshift File.join(File.dirname(__FILE__))

чтобы убедиться, что вы получаете путь, основанный на том, где находится script, а не где выполняется программа. В противном случае вы избавляетесь от преимуществ безопасности, полученных путем удаления "." из пути загрузки.

(Да, в заголовке вопроса говорится о требовании файла в каталоге, из которого выполняется script, но в теле вопроса упоминается, что требуемый файл находится в той же папке, что и script в вопрос)

Ответ 3

В 1.9 синтаксис изменился на require_relative, как сказал другой ответ на этот вопрос.

Если вы пишете в Ruby 1.8, я предлагаю писать свой код в перспективном режиме и используя require_relative gem, так что вы можете используйте это ключевое слово в своем Ruby 1.8 и обменивайтесь одним менее переходным, когда вы переходите к 1.9

Ответ 4

и...

требуется "./myRubyFile" # уведомление, мы исключаем .rb из myRubyFile.rb

Ответ 5

$LOAD_PATH << Dir.pwd
require 'sql_parser'

Как отмечено @AndrewGrimm, из соображений безопасности вы должны использовать это вместо:

$LOAD_PATH << File.join(File.dirname(__FILE__))
require 'sql_parser'

Ваш каталог должен находиться в текущем пути загрузки. Путь загрузки хранится в глобальном массиве с именем $LOAD_PATH. Если вы добавите в него свой текущий каталог, вы можете использовать require для загрузки любых файлов в каталог.

Использование Dir.pwd вместо pwd.chomp, предложенное Tin Man

Кроме того, я предпочитаю это над require_relative, если у вас нет действительно маленького проекта, иначе все может стать уродливым.