Яка найкраща практика, якщо я хочу 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
в поточному каталозі (як правило, той же самий dir, що і з a.rb
), ви просто напишете, require 'b'
і це буде добре, оскільки поточний каталог пошуку за замовчуванням включає поточний каталог. У більш сучасному Ruby 1.9 require_relative 'b'
в цьому випадку вам доведеться писати так, як require 'b'
шукати тільки в стандартних бібліотечних контурах. Це справа в тому, що такий вид перерви сумісності вперед і назад для більш простих сценаріїв, які не будуть встановлені належним чином (наприклад, встановлення самих скриптів).
backports
лише для require_relative
, дивіться мою відповідь ...
require
іrequire_relative
?