Какова наилучшая практика, если я хочу require
относительный файл в Ruby, и я хочу, чтобы он работал как в файлах 1.8.x и >= 1.9.2?
Я вижу несколько вариантов:
- просто сделайте
$LOAD_PATH << '.'
и забудьте все - do
$LOAD_PATH << File.dirname(__FILE__)
-
require './path/to/file'
- проверьте, если
RUBY_VERSION
< 1.9.2, затем определитеrequire_relative
какrequire
, используйтеrequire_relative
всюду, где это необходимо впоследствии - проверьте, существует ли
require_relative
, если это так, попробуйте продолжить, как в предыдущем случае - использовать такие странные конструкции, как
require File.join(File.dirname(__FILE__), 'path/to/file')
- увы, они, похоже, не работают в Ruby 1.9, потому что, например:
$ cat caller.rb require File.join(File.dirname(__FILE__), 'path/to/file') $ cat path/to/file.rb puts 'Some testing' $ ruby caller Some testing $ pwd /tmp $ ruby /tmp/caller Some testing $ ruby tmp/caller tmp/caller.rb:1:in 'require': no such file to load -- tmp/path/to/file (LoadError) from tmp/caller.rb:1:in '<main>'
- Даже более сложная конструкция:
require File.join(File.expand_path(File.dirname(__FILE__)), 'path/to/file')
, похоже, работает, но это странно и не очень хорошо выглядит.
- Используйте backports gem - он тяжелый, он требует инфраструктуры rubygems и включает тонны других обходных решений, в то время как я просто хочу
require
для работы с относительными файлами.
Там qaru.site/info/32400/..., который дает еще несколько примеров, но он не дает четкого ответа - что является лучшей практикой.
Есть ли какое-либо достойное универсальное решение, принятое всеми, чтобы мое приложение выполнялось на Ruby < 1.9.2 и >= 1.9.2?
UPDATE
Уточнение: я не хочу просто ответов, таких как "вы можете сделать X" - на самом деле, я уже упомянул большинство вариантов, о которых идет речь. Я хочу обоснования, то есть, почему это лучшая практика, каковы ее плюсы и минусы и почему ее следует выбирать среди других.