Die neuesten Änderungssätze für Ruby 1.9.2 machen das aktuelle Verzeichnis nicht mehr zu einem .
Teil Ihres Verzeichnisses LOAD_PATH
. Ich habe eine nicht triviale Anzahl von Rakefiles, die davon ausgehen, dass dies .
Teil von ist LOAD_PATH
, sodass diese beschädigt wurden (sie meldeten "keine solche Datei zum Laden" für alle erforderlichen Anweisungen, die auf dem Projektpfad basieren). Gab es dafür eine besondere Rechtfertigung?
Was das $: << "."
Problem angeht , funktioniert das Hinzufügen überall, aber es scheint unglaublich hackig zu sein, und das möchte ich nicht. Was ist der bevorzugte Weg, um meine Rakefiles 1.9.2+ kompatibel zu machen?
require_relative
. Vielen Dank.require './filename'
Funktioniert nur, wenn Ihr Skript mit dem Arbeitsverzeichnis ausgeführt wird, das auf dasselbe Verzeichnis eingestellt ist, in dem sich das Skript befindet. Dies ist bei Projekten mit mehreren Verzeichnissen häufig nicht der Fall.Es gibt zwei Gründe:
Beide basieren auf demselben Prinzip: Im Allgemeinen können Sie einfach nicht wissen, wie das aktuelle Verzeichnis lautet, wenn Ihr Code ausgeführt wird. Das heißt, wenn Sie eine Datei benötigen und davon abhängig sind, dass sie sich im aktuellen Verzeichnis befindet, können Sie nicht steuern, ob diese Datei überhaupt vorhanden ist oder ob es sich um die Datei handelt, von der Sie tatsächlich erwarten, dass sie vorhanden ist.
quelle
.
aktuellen Arbeitsverzeichnis zu platzieren. Wenn sich der Benutzercd
in einem anderen Verzeichnis befindet, ändert sich das aktuelle Arbeitsverzeichnis, und Sie haben jetztrequire
völlig unterschiedliche Dateien, je nachdem, in welchem Verzeichnis sich der Benutzer gerade befand, als er Ihr Skript aufrief. Ich denke nicht, dass das eine gute Idee ist.$: << File.dirname(__FILE__)
lib
Verzeichnis in der$LOAD_PATH
und dann inrequire
allen Dateien relativ zu befindetlib
. Mit anderen Worten: Ich überlasse es dem Administrator, herauszufinden, wie das$LOAD_PATH
richtig eingerichtet wird. Wenn Sie RubyGems verwenden, ist dies trivial, da RubyGems dies automatisch für Sie erledigt. Wenn Sie Debian-Pakete verwenden, ist dies die Aufgabe des Paketverwalters. Alles in allem scheint es ganz gut zu funktionieren..
von$LOAD_PATH
Ruby 1.9.2 wird außerdem eingeführt,require_relative
welche ... Überraschung ... einerequire
Datei relativ zum Speicherort der aktuell ausgeführten Datei (dh relativ zuFile.dirname(__FILE__)
) ist.Wie andere Antworten hervorheben, handelt es sich um ein Sicherheitsrisiko, da sich
.
Ihr Ladepfad auf das aktuelle Arbeitsverzeichnis beziehtDir.pwd
und nicht auf das Verzeichnis der aktuell geladenen Datei. Wer also Ihr Skript ausführt, kann dies einfach ändern, indem ercd
in ein anderes Verzeichnis wechselt. Nicht gut!Ich habe vollständige Pfade
__FILE__
als Alternative verwendet.Im Gegensatz
require_relative
dazu ist dies abwärtskompatibel mit Ruby 1.8.7.quelle
require Pathname.new(__FILE__).dirname + 'filename'
Verwenden
require_relative 'file_to_require'
Fügen Sie dies in Ihren Code ein, damit require_relative in 1.8.7 funktioniert:
quelle
'.' auf Ihrem Weg wurde in der Unix-Welt lange Zeit als eine schlechte Sache angesehen (siehe zum Beispiel http://www.faqs.org/faqs/unix-faq/faq/part2/section-13.html ). Ich gehe davon aus, dass die Ruby-Leute von der Weisheit überzeugt wurden, das nicht zu tun.
quelle
Ich fand das eine verwirrende Veränderung, bis ich ein paar Dinge realisierte.
Sie können RUBYLIB in Ihrem .profile (Unix) festlegen und das Leben wie zuvor fortsetzen:
export RUBYLIB="."
Aber wie oben erwähnt, wurde dies lange Zeit als unsicher angesehen.
In den allermeisten Fällen können Sie Probleme vermeiden, indem Sie einfach Ihre Ruby-Skripte mit einem vorangestellten 'aufrufen.' zB ./scripts/server.
quelle
Wie Jörg W. Mittag betonte, möchten Sie meiner Meinung nach die von
require_relative
Ihnen benötigte Datei relativ zur Quelldatei derrequire
Deklaration und nicht zum aktuellen Arbeitsverzeichnis verwenden.Ihre Abhängigkeiten sollten relativ zu Ihrer Rake-Build-Datei sein.
quelle