Является ли require File.expand_path (..., __FILE__) лучшей практикой? - PullRequest
49 голосов
/ 01 декабря 2010

Является ли require File.expand_path(..., __FILE__) лучшим способом требовать другие файлы в проекте?

Ответы [ 4 ]

37 голосов
/ 01 декабря 2010

В Ruby 1.9.2 + require_relative, вероятно, является более правильным способом сделать это.

require был изменен, чтобы не включать ваш каталог '.' по соображениям безопасности. require_relative был добавлен для предоставления локально-файлового решения для модулей относительно пути вашего вызывающего скрипта.

Вы можете выполнить поиск здесь в StackOverflow , особенно в " Что такое require_relative в Ruby? ", а также в интернете и найти приемы использования и сообщения "почему-для" объясняя, как это произошло.

7 голосов
/ 02 сентября 2013

В Ruby 2.x вы можете использовать Kernel#__dir__

3 голосов
/ 01 декабря 2010

Если вы не измените $LOAD_PATH, что было бы неплохо, если вы продолжаете загрузку из той же структуры каталогов, вы застряли, делая это таким образом.

То, как я это сделал,чтобы обеспечить максимально возможную кроссплатформенность, выполните следующие действия:

require File.expand_path(File.join(*%w[ ... ]), File.dirname(__FILE__))

Это немного многословно, но в большинстве случаев это приводит к кратчайшему возможному пути и наименьшему объему синтаксического потока.

Более конкретный пример:

require File.expand_path(File.join(*%w[ .. lib example ]), File.dirname(__FILE__))

Вы можете объединить это с модификацией $LOAD_PATH, чтобы упростить процесс, если вы загружаете много файлов и делаете это:

$LOAD_PATH << File.expand_path(File.join(*%w[ .. lib ]), File.dirname(__FILE__))

require 'example'
2 голосов
/ 01 декабря 2010

В Ruby 1.8.x, где в ядре нет require_relative, File.expand_path(...,__FILE__) не будет работать.

Предположим, __FILE__ == "/home/yourname/foo.rb".File.expand_path("bar.rb",__FILE__) дает "/home/yourname/foo.rb/bar.rb.

То, что вы хотите, это File.expand_path("bar.rb",File.dirname(__FILE__)), который возвращает "/home/yourname/bar.rb"

Вы также можете получить require_relative из гема backports .

...