Jaka jest najlepsza praktyka, jeśli chcę require
pliku względnej w Ruby i chcę go do pracy zarówno 1.8.x oraz> = 1.9.2?
Widzę kilka opcji:
- po prostu zrób
$LOAD_PATH << '.'
i zapomnij o wszystkim - robić
$LOAD_PATH << File.dirname(__FILE__)
require './path/to/file'
- sprawdź, czy
RUBY_VERSION
<1.9.2, a następnie zdefiniujrequire_relative
jakorequire
, użyjrequire_relative
później wszędzie tam, gdzie jest to potrzebne - sprawdź, czy
require_relative
już istnieje, jeśli tak, spróbuj postępować jak w poprzednim przypadku - używają dziwnych konstrukcji, takich jak - niestety nie wydaje się, aby działały w pełni w Rubim 1.9, ponieważ na przykład:
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>'
- Jeszcze dziwniejsza konstrukcja: wydaje się działać, ale jest dziwna i niezbyt ładna.
require File.join(File.expand_path(File.dirname(__FILE__)), 'path/to/file')
- Użyj klejnotów backportów - jest trochę ciężki, wymaga infrastruktury rubygemów i zawiera mnóstwo innych obejść, podczas gdy ja chcę po prostu
require
pracować z plikami względnymi.
W StackOverflow jest blisko powiązane pytanie, które zawiera więcej przykładów, ale nie daje jasnej odpowiedzi - co jest najlepszą praktyką.
Czy istnieje jakieś przyzwoite, akceptowane przez wszystkich uniwersalne rozwiązanie, które sprawi, że moja aplikacja będzie działać na Rubim <1.9.2 i> = 1.9.2?
AKTUALIZACJA
Wyjaśnienie: nie chcę tylko odpowiedzi typu „możesz zrobić X” - w rzeczywistości wspomniałem już o większości opcji, o których mowa. Chcę uzasadnienia , czyli dlaczego jest to najlepsza praktyka, jakie są jej wady i zalety oraz dlaczego należy ją wybrać spośród innych.
a.rb
i chciałeś, aby interpreter odczytywał i parsował zawartość pliku b.rb
w bieżącym katalogu (zwykle w tym samym katalogu co w a.rb
), po prostu napisz require 'b'
i będzie dobrze, ponieważ domyślna ścieżka wyszukiwania zawiera bieżący katalog. W bardziej nowoczesnym Ruby 1.9 będziesz musiał pisać require_relative 'b'
w tym przypadku, tak jakbyś require 'b'
szukał tylko w standardowych ścieżkach bibliotek. To jest coś, co łamie kompatybilność do przodu i do tyłu dla prostszych skryptów, które nie będą poprawnie instalowane (na przykład same skrypty instalacyjne ).
backports
tylko dla require_relative
, zobacz moją odpowiedź ...
require
irequire_relative
?