Требуется ли File.expand_path (..., __FILE__) наилучшая практика?

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

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

Если вы не измените $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'

Ответ 4

В 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 gem.