我一直在 Ruby 中看到这一点:
require File.dirname(__FILE__) + "/../../config/environment"
__FILE__
是什么意思?
它是对当前文件名的引用。在文件 foo.rb
中,__FILE__
将被解释为 "foo.rb"
。
编辑: Ruby 1.9.2 和 1.9.3 的行为似乎与 Luke Bayes 在 his comment 中所说的略有不同。使用这些文件:
# test.rb
puts __FILE__
require './dir2/test.rb'
# dir2/test.rb
puts __FILE__
运行 ruby test.rb
将输出
test.rb
/full/path/to/dir2/test.rb
__FILE__
的值是在加载文件时创建和存储(但从未更新)的相对路径。这意味着,如果您在应用程序的其他任何位置调用 Dir.chdir
,此路径将不正确地扩展。
puts __FILE__
Dir.chdir '../../'
puts __FILE__
此问题的一种解决方法是将 __FILE__
的扩展值存储在任何应用程序代码之外。只要您的 require
语句位于定义的顶部(或至少在对 Dir.chdir
的任何调用之前),此值在更改目录后将继续有用。
$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.
在我的测试下,路径扩展正确。我的 ruby 版本是 2.3.7,也许更新的 ruby 版本解决了这个问题。
__FILE__
是包含正在执行的代码的文件扩展名的文件名。
在 foo.rb
中,__FILE__
将是“foo.rb”。
如果 foo.rb
在目录 /home/josh
中,则 File.dirname(__FILE__)
将返回 /home/josh
。
在 Ruby(无论如何是 Windows 版本)中,我刚刚检查过 __FILE__
不包含文件的完整路径。相反,它包含文件相对于执行位置的路径。
在 PHP 中 __FILE__
是完整路径(在我看来这是更可取的)。这就是为什么,为了让你的路径在 Ruby 中可移植,你真的需要使用这个:
File.expand_path(File.dirname(__FILE__) + "relative/path/to/file")
我应该注意,在 Ruby 1.9.1 中 __FILE__
包含文件的完整路径,上面的描述是针对我使用 Ruby 1.8.7 时的。
为了与 Ruby 1.8.7 和 1.9.1(不确定 1.9)兼容,您应该使用我上面显示的结构来 require 文件。
File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )
`__FILE__`
得到__FILE__
。