Что лучше, если я хочу require
относительный файл в Ruby и Я хочу, чтобы он работал как в 1.8.x, так и> = 1.9.2?
Я вижу несколько вариантов:
- просто сделай
$LOAD_PATH << '.'
и забудь все
- до
$LOAD_PATH << File.dirname(__FILE__)
require './path/to/file'
- проверьте, если
RUBY_VERSION
<1.9.2, затем определите <code>require_relative как require
, затем используйте require_relative
везде, где это необходимо
- проверьте, если
require_relative
уже существует, если это так, попробуйте продолжить, как в предыдущем случае
- использовать странные конструкции, такие как
<pre><code>require File.join(File.dirname(__FILE__), 'path/to/file')
- увы, они не работают должным образом в Ruby 1.9, потому что, например: <code>$ 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>'</code>
- Даже более странная конструкция:
<pre><code>require File.join(File.expand_path(File.dirname(__FILE__)), 'path/to/file')
, кажется, работает, но это странно и не совсем хорошо выглядит.
- Используйте backports gem - он довольно тяжелый, требует инфраструктуры rubygems и включает в себя множество других обходных путей, а я просто хочу, чтобы
require
работал с относительными файлами.
В StackOverflow есть тесно связанный вопрос *1045*, который дает еще несколько примеров, но не дает четкого ответа - что является наилучшей практикой.
Есть ли какое-нибудь достойное, общепризнанное, универсальное решение для запуска моего приложения на Ruby <1.9.2 и> = 1.9.2?
* * ОБНОВЛЕНИЕ тысячи сорок-девять
Разъяснение: я не хочу просто отвечать, как "вы можете сделать X" - на самом деле, я уже упомянул большинство рассматриваемых вариантов. Я хочу обоснование , т. Е. почему это лучшая практика, каковы ее плюсы и минусы и почему ее следует выбирать среди других.