是否需要File.expand_path(…,__FILE__)最佳实践?
是否require File.expand_path(..., __FILE__)
要求项目中的其他文件的最佳方式?
在Ruby 1.9.2 + require_relative
可能是更正确的方法。
require
被改为不包括你的'.'
目录出于安全原因。 require_relative
被添加来为模块提供一个相对于调用脚本path的本地文件解决scheme。
你可以在这里searchStackOverflow ,特别是在“ 什么是Ruby中的require_relative? ”,以及互联网,并find使用技巧和原因,以解释它是如何产生的。
在Ruby 2.0中,您可以使用Kernel#__dir__
除非你修改$LOAD_PATH
,如果你继续从相同的目录结构加载,这是一个好主意,你坚持这样做。
我已经采取了这样做的方式,以确保事情尽可能跨平台,是这样的:
require File.expand_path(File.join(*%w[ ... ]), File.dirname(__FILE__))
这有点冗长,但是在大多数情况下,这会导致最短path和最less的语法松散。
更具体的例子是:
require File.expand_path(File.join(*%w[ .. lib example ]), File.dirname(__FILE__))
如果你加载了很多的文件,你可以把它与$LOAD_PATH
的修改结合起来,以简化这个事情:
$LOAD_PATH << File.expand_path(File.join(*%w[ .. lib ]), File.dirname(__FILE__)) require 'example'
在Ruby 1.8.x中,核心中没有require_relative
, File.expand_path(...,__FILE__)
将不起作用。
假设__FILE__ == "/home/yourname/foo.rb"
。 File.expand_path("bar.rb",__FILE__)
给出"/home/yourname/foo.rb/bar.rb
。
你想要的是File.expand_path("bar.rb",File.dirname(__FILE__))
,它返回"/home/yourname/bar.rb"
您也可以从backports gem中获取require_relative
。