是否需要File.expand_path(...,__ FILE__)最佳实践?

时间:2010-12-01 15:12:16

标签: ruby require

require File.expand_path(..., __FILE__)是否需要项目中其他文件的最佳方式?

4 个答案:

答案 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_relativeFile.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