Какова лучшая практика, если я хочу require
относительный файл в Ruby, и я хочу, чтобы он работал как в 1.8.x, так и> = 1.9.2?
Я вижу несколько вариантов:
- просто сделай
$LOAD_PATH << '.'
и забудь все - делать
$LOAD_PATH << File.dirname(__FILE__)
require './path/to/file'
- проверьте, если
RUBY_VERSION
<1.9.2, то определитеrequire_relative
какrequire
, затем используйтеrequire_relative
везде, где это необходимо - проверьте,
require_relative
существует ли уже, если это так, попробуйте продолжить, как в предыдущем случае - используйте странные конструкции, такие как - увы, они не работают должным образом в Ruby 1.9, потому что, например:
require File.join(File.dirname(__FILE__), 'path/to/file')
$ 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 - он довольно тяжелый, требует инфраструктуры rubygems и включает в себя множество других обходных путей, а я просто хочу
require
работать с относительными файлами.
В StackOverflow есть тесно связанный вопрос, который дает еще несколько примеров, но он не дает четкого ответа - что является лучшей практикой.
Есть ли какое-нибудь приемлемое, общепризнанное универсальное решение для запуска моего приложения на Ruby <1.9.2 и> = 1.9.2?
ОБНОВИТЬ
Пояснение: я не хочу просто отвечать, как «вы можете сделать X» - на самом деле, я уже упомянул большинство рассматриваемых вариантов. Я хочу обоснование , то есть, почему это лучшая практика, каковы ее плюсы и минусы и почему ее следует выбирать среди других.
a.rb
и хотели, чтобы интерпретатор считывал и анализировал содержимое файла b.rb
в текущем каталоге (обычно тот же каталог, что и в a.rb
), вы просто пишете, require 'b'
и это будет хорошо, поскольку путь поиска по умолчанию включает текущий каталог. В более современном Ruby 1.9 вам придется писать require_relative 'b'
в этом случае, как если require 'b'
бы вы искали только стандартные пути к библиотекам. Это то, что нарушает прямую и обратную совместимость для простых сценариев, которые не будут установлены должным образом (например, сами сценарии установки ).
backports
только для require_relative
, см. Мой ответ ...
require
иrequire_relative
?