Ich sehe das die ganze Zeit in Ruby:
require File.dirname(__FILE__) + "/../../config/environment"
Was heißt __FILE__
das
Ich sehe das die ganze Zeit in Ruby:
require File.dirname(__FILE__) + "/../../config/environment"
Was heißt __FILE__
das
Antworten:
Es ist ein Verweis auf den aktuellen Dateinamen. In der Datei foo.rb
, __FILE__
würde interpretiert als "foo.rb"
.
Edit: Ruby 1.9.2 und 1.9.3 scheinen sich ein wenig anders zu verhalten als das, was Luke Bayes in seinem Kommentar gesagt hat . Mit diesen Dateien:
# test.rb
puts __FILE__
require './dir2/test.rb'
# dir2/test.rb
puts __FILE__
Laufen ruby test.rb
wird ausgegeben
test.rb
/full/path/to/dir2/test.rb
`__FILE__`
, um zu bekommen __FILE__
.
Der Wert von __FILE__
ist ein relativer Pfad, der beim Laden Ihrer Datei erstellt und gespeichert (aber nie aktualisiert) wird. Dies bedeutet, dass Dir.chdir
dieser Pfad falsch erweitert wird , wenn Sie an einer anderen Stelle in Ihrer Anwendung Anrufe tätigen .
puts __FILE__
Dir.chdir '../../'
puts __FILE__
Eine Problemumgehung für dieses Problem besteht darin, den erweiterten Wert __FILE__
außerhalb eines Anwendungscodes zu speichern . Solange Ihre require
Anweisungen oben in Ihren Definitionen stehen (oder zumindest vor Aufrufen von Dir.chdir
), ist dieser Wert nach dem Ändern der Verzeichnisse weiterhin nützlich.
$MY_FILE_PATH = File.expand_path(File.dirname(__FILE__))
# open class and do some stuff that changes directory
puts $MY_FILE_PATH
This means that if you have any calls to Dir.chdir anywhere else in your application, this path will expand incorrectly.
Der Pfad wurde unter meinem Test korrekt erweitert. Meine Ruby-Version ist 2.3.7, möglicherweise hat die neuere Ruby-Version dieses Problem behoben.
__FILE__
ist der Dateiname mit der Erweiterung der Datei, die den ausgeführten Code enthält.
In foo.rb
, __FILE__
wäre "foo.rb".
Wenn foo.rb
in der dir wäre /home/josh
dann File.dirname(__FILE__)
würde zurückkehren /home/josh
.
In Ruby, der Windows-Version sowieso, habe ich gerade überprüft und __FILE__
enthält nicht den vollständigen Pfad zur Datei. Stattdessen enthält es den Pfad zur Datei relativ zu dem Ort, von dem aus sie ausgeführt wird.
In PHP __FILE__
ist der vollständige Pfad (was meiner Meinung nach vorzuziehen ist). Aus diesem Grund müssen Sie Folgendes verwenden, um Ihre Pfade in Ruby portierbar zu machen:
File.expand_path(File.dirname(__FILE__) + "relative/path/to/file")
Ich sollte beachten, dass in Ruby 1.9.1 __FILE__
der vollständige Pfad zur Datei enthalten ist. Die obige Beschreibung war für die Verwendung von Ruby 1.8.7 vorgesehen.
Um sowohl mit Ruby 1.8.7 als auch mit 1.9.1 kompatibel zu sein (nicht sicher über 1.9), sollten Sie Dateien mit dem oben gezeigten Konstrukt benötigen.
File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )