Ruby: require vs require_relative - рекомендуется использовать обходные пути для Ruby <1.9.2 и> = 1.9.2 - PullRequest
152 голосов
/ 02 декабря 2010

Что лучше, если я хочу 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" - на самом деле, я уже упомянул большинство рассматриваемых вариантов. Я хочу обоснование , т. Е. почему это лучшая практика, каковы ее плюсы и минусы и почему ее следует выбирать среди других.

Ответы [ 11 ]

0 голосов
/ 23 февраля 2017

Ruby on Rails путь:

config_path = File.expand_path("../config.yml", __FILE__)
...