Является ли require File.expand_path(..., __FILE__)
лучшим способом для использования других файлов в проекте?
Требуется ли 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.