require File.expand_path(..., __FILE__)
是否需要项目中其他文件的最佳方式?
答案 0 :(得分:37)
在Ruby 1.9.2中,require_relative
可能是更正确的方法。
require
已更改为不包含您的'.'
目录。添加了require_relative
,以便为与调用脚本的路径相关的模块提供本地文件解决方案。
你可以search here on StackOverflow,特别是“What is require_relative in Ruby?”,以及互联网和查找使用技巧,why-for messages解释它是如何产生的。
答案 1 :(得分:7)
在Ruby 2.x中,您可以使用Kernel#__dir__
答案 2 :(得分:3)
除非你修改$LOAD_PATH
,如果你继续从同一个目录结构加载,这将是一个好主意,你就是这样做了。
我采取的方式,以确保事情尽可能跨平台,是这样的:
require File.expand_path(File.join(*%w[ ... ]), File.dirname(__FILE__))
它有点冗长,但在大多数情况下,它会产生尽可能短的路径和最少量的语法绒毛。
更具体的例子是:
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'
答案 3 :(得分:2)
在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
。