Je vois ça tout le temps en Ruby:
require File.dirname(__FILE__) + "/../../config/environment"
Que veut __FILE__
dire?
Je vois ça tout le temps en Ruby:
require File.dirname(__FILE__) + "/../../config/environment"
Que veut __FILE__
dire?
Réponses:
Il s'agit d'une référence au nom de fichier actuel. Dans le fichier foo.rb
, __FILE__
serait interprété comme "foo.rb"
.
Edit: Ruby 1.9.2 et 1.9.3 semblent se comporter un peu différemment de ce que Luke Bayes a dit dans son commentaire . Avec ces fichiers:
# test.rb
puts __FILE__
require './dir2/test.rb'
# dir2/test.rb
puts __FILE__
La course ruby test.rb
produira
test.rb
/full/path/to/dir2/test.rb
`__FILE__`
pour obtenir __FILE__
.
La valeur de __FILE__
est un chemin relatif qui est créé et stocké (mais jamais mis à jour) lorsque votre fichier est chargé. Cela signifie que si vous avez des appels vers Dir.chdir
un autre endroit de votre application, ce chemin d'accès ne se développera pas correctement.
puts __FILE__
Dir.chdir '../../'
puts __FILE__
Une solution de contournement à ce problème consiste à stocker la valeur étendue de l' __FILE__
extérieur de tout code d'application. Tant que vos require
instructions sont en haut de vos définitions (ou au moins avant tout appel à Dir.chdir
), cette valeur continuera d'être utile après avoir changé de répertoire.
$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.
Le chemin s'est correctement développé sous mon test. Ma version rubis est 2.3.7, peut-être que la nouvelle version rubis a résolu ce problème.
__FILE__
est le nom de fichier avec l'extension du fichier contenant le code en cours d'exécution.
Dans foo.rb
, __FILE__
serait "foo.rb".
Si se foo.rb
trouvaient dans le répertoire /home/josh
puis File.dirname(__FILE__)
reviendrait /home/josh
.
Dans Ruby, la version Windows de toute façon, je viens de vérifier et __FILE__
ne contient pas le chemin d'accès complet au fichier. Au lieu de cela, il contient le chemin d'accès au fichier par rapport à son emplacement d'exécution.
En PHP, __FILE__
c'est le chemin complet (qui à mon avis est préférable). C'est pourquoi, pour rendre vos chemins portables dans Ruby, vous devez vraiment utiliser ceci:
File.expand_path(File.dirname(__FILE__) + "relative/path/to/file")
Je dois noter que dans Ruby 1.9.1 __FILE__
contient le chemin d'accès complet au fichier, la description ci-dessus était pour quand j'ai utilisé Ruby 1.8.7.
Afin d'être compatible avec Ruby 1.8.7 et 1.9.1 (pas sûr de 1.9), vous devez avoir besoin de fichiers en utilisant la construction que j'ai montrée ci-dessus.
File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )