Was ist die beste Praxis , wenn ich will require
eine relative Datei in Ruby und ich möchte es in beiden 1.8.x arbeiten und> = 1.9.2?
Ich sehe einige Optionen:
- einfach
$LOAD_PATH << '.'
alles tun und vergessen - machen
$LOAD_PATH << File.dirname(__FILE__)
require './path/to/file'
- Überprüfen Sie, ob
RUBY_VERSION
<1.9.2, und definieren Sie dannrequire_relative
alsrequire
,require_relative
überall dort verwenden , wo es später benötigt wird - Überprüfen Sie, ob dies
require_relative
bereits vorhanden ist. Versuchen Sie in diesem Fall, wie im vorherigen Fall fortzufahren - Verwenden Sie seltsame Konstruktionen wie - leider scheinen sie in Ruby 1.9 nicht vollständig zu funktionieren, weil zum Beispiel:
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>'
- Noch seltsamere Konstruktion: scheint zu funktionieren, ist aber seltsam und sieht nicht ganz gut aus.
require File.join(File.expand_path(File.dirname(__FILE__)), 'path/to/file')
- Verwenden Sie Backports Gem - es ist ziemlich schwer, es erfordert Rubygems-Infrastruktur und enthält Tonnen anderer Problemumgehungen, während ich nur
require
mit relativen Dateien arbeiten möchte .
Bei StackOverflow gibt es eine eng verwandte Frage , die einige weitere Beispiele enthält, aber keine klare Antwort gibt - was eine bewährte Methode ist.
Gibt es eine anständige, von allen akzeptierte universelle Lösung, mit der meine Anwendung sowohl auf Ruby <1.9.2 als auch auf> = 1.9.2 ausgeführt werden kann?
AKTUALISIEREN
Klarstellung: Ich möchte nicht nur Antworten wie "Sie können X machen" - tatsächlich habe ich die meisten fraglichen Entscheidungen bereits erwähnt. Ich möchte eine Begründung , dh warum es sich um eine bewährte Methode handelt, welche Vor- und Nachteile sie hat und warum sie unter den anderen ausgewählt werden sollte.
a.rb
und den Interpreter dazu bringen möchten, den Inhalt der Datei b.rb
im aktuellen Verzeichnis zu lesen und zu analysieren (normalerweise das gleiche Verzeichnis wie bei a.rb
), schreiben Sie einfach require 'b'
und dies ist in Ordnung, da der Standardsuchpfad das aktuelle Verzeichnis enthält. In modernerem Ruby 1.9 müssen Sie require_relative 'b'
in diesem Fall schreiben , da require 'b'
nur in Standardbibliothekspfaden gesucht wird. Das ist die Sache, die die Vorwärts- und Rückwärtskompatibilität für einfachere Skripte unterbricht, die nicht richtig installiert werden (z. B. Skripte selbst installieren ).
backports
nur für verwenden require_relative
, siehe meine Antwort ...
require
undrequire_relative
?