Veo esto todo el tiempo en Ruby:
require File.dirname(__FILE__) + "/../../config/environment"
Que __FILE__
significa
Veo esto todo el tiempo en Ruby:
require File.dirname(__FILE__) + "/../../config/environment"
Que __FILE__
significa
Respuestas:
Es una referencia al nombre del archivo actual. En el archivo foo.rb
, __FILE__
se interpretaría como "foo.rb"
.
Editar: Ruby 1.9.2 y 1.9.3 parecen comportarse un poco diferente de lo que dijo Luke Bayes en su comentario . Con estos archivos:
# test.rb
puts __FILE__
require './dir2/test.rb'
# dir2/test.rb
puts __FILE__
La ejecución ruby test.rb
dará salida
test.rb
/full/path/to/dir2/test.rb
`__FILE__`
para obtener __FILE__
.
El valor de __FILE__
es una ruta relativa que se crea y almacena (pero nunca se actualiza) cuando se carga el archivo. Esto significa que si tiene alguna llamada a Dir.chdir
cualquier otro lugar de su aplicación, esta ruta se expandirá incorrectamente.
puts __FILE__
Dir.chdir '../../'
puts __FILE__
Una solución a este problema es almacenar el valor expandido __FILE__
fuera de cualquier código de aplicación. Mientras sus require
declaraciones estén en la parte superior de sus definiciones (o al menos antes de cualquier llamada a Dir.chdir
), este valor continuará siendo útil después de cambiar los directorios.
$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.
El camino se expandió correctamente bajo mi prueba. Mi versión ruby es 2.3.7, tal vez la versión ruby más nueva solucionó este problema.
__FILE__
es el nombre del archivo con la extensión del archivo que contiene el código que se está ejecutando.
En foo.rb
, __FILE__
sería "foo.rb".
Si foo.rb
estaban en el dir /home/josh
entonces File.dirname(__FILE__)
volvería /home/josh
.
En Ruby, la versión de Windows de todos modos, acabo de comprobar y __FILE__
no contiene la ruta completa al archivo. En su lugar, contiene la ruta al archivo en relación con el lugar desde donde se ejecuta.
En PHP __FILE__
es la ruta completa (que en mi opinión es preferible). Esta es la razón por la cual, para hacer que sus caminos sean portátiles en Ruby, realmente necesita usar esto:
File.expand_path(File.dirname(__FILE__) + "relative/path/to/file")
Debo señalar que en Ruby 1.9.1 __FILE__
contiene la ruta completa al archivo, la descripción anterior fue para cuando utilicé Ruby 1.8.7.
Para ser compatible con Ruby 1.8.7 y 1.9.1 (no estoy seguro acerca de 1.9), debe requerir archivos utilizando la construcción que mostré anteriormente.
File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )