Последние изменения в Ruby 1.9.2 больше не делают текущий каталог .
частью вашего LOAD_PATH
. У меня есть нетривиальное количество файлов Rake, которые предполагают, что они .
являются частью LOAD_PATH
, поэтому это сломало их (они сообщили «нет такого файла для загрузки» для всех операторов require, основанных на пути проекта). Было ли какое-то конкретное оправдание для этого?
Что касается исправления, добавление $: << "."
везде работает, но кажется невероятным, и я не хочу этого делать. Какой предпочтительный способ сделать мой Rakefiles 1.9.2+ совместимым?
require_relative
. Спасибо.require './filename'
работает только в том случае, если ваш скрипт выполняется с рабочим каталогом, установленным в тот же каталог, в котором находится скрипт. Это часто не относится к проектам с несколькими каталогами.Есть две причины:
Оба основаны на одном и том же базовом принципе: в общем, вы просто не можете знать, каков текущий каталог, когда ваш код выполняется. Это означает, что, когда вам требуется файл и вы зависите от того, находится ли он в текущем каталоге, у вас нет возможности контролировать, будет ли этот файл вообще там или это тот файл, который вы действительно ожидаете там.
источник
.
текущего рабочего каталога. Если пользователь находитсяcd
в другом каталоге, текущий рабочий каталог изменяется, и вы теперьrequire
совершенно разные файлы, в зависимости от того, в каком каталоге находился пользователь, когда он вызывал ваш скрипт. Я не думаю, что это хорошая идея.$: << File.dirname(__FILE__)
lib
каталог находится,$LOAD_PATH
а затемrequire
все файлы, относящиеся кlib
. Другими словами: я оставляю это администратору, чтобы выяснить, как правильно настроить$LOAD_PATH
. Если вы используете RubyGems, это тривиально, потому что RubyGems автоматически делает это за вас, а если вы используете пакеты Debian, то это работа сопровождающего пакета. В целом, это, кажется, работает довольно хорошо..
из$LOAD_PATH
Ruby 1.9.2 вводится файлrequire_relative
... неожиданный ...require
sa относительно местоположения исполняемого в данный момент файла (то есть относительноFile.dirname(__FILE__)
).Как указывают другие ответы, это угроза безопасности, поскольку
.
в вашем пути загрузки указывается текущий рабочий каталогDir.pwd
, а не каталог текущего загружаемого файла. Так что, кто бы ни выполнял ваш скрипт, он может изменить это, простоcd
перейдя в другой каталог. Не хорошо!Я использовал полные пути, построенные
__FILE__
в качестве альтернативы.В отличие от
require_relative
этого, он обратно совместим с Ruby 1.8.7.источник
require Pathname.new(__FILE__).dirname + 'filename'
использование
require_relative 'file_to_require'
Добавьте это в свой код, чтобы сделать require_relative работу в 1.8.7:
источник
'' Ваш путь уже давно считается плохим явлением в мире Unix (см., например, http://www.faqs.org/faqs/unix-faq/faq/part2/section-13.html ). Я предполагаю, что ребята из Ruby были убеждены в мудрости этого не делать.
источник
Я нашел, что это было смущающее изменение, пока я не понял пару вещей.
Вы можете установить RUBYLIB в свой .profile (Unix) и продолжать жить, как вы делали это раньше:
export RUBYLIB="."
Но, как упоминалось выше, это уже давно считается небезопасным.
В подавляющем большинстве случаев вы можете избежать проблем, просто вызывая свои сценарии Ruby с префиксом '.' например ./scripts/server.
источник
Как отметил Йорг Миттаг, я думаю, что вы хотите использовать,
require_relative
чтобы требуемый файл относился к исходному файлуrequire
объявления, а не к текущему рабочему каталогу.Ваши зависимости должны быть относительно вашего файла сборки рейка.
источник