为什么Ruby 1.9.2从LOAD_PATH中删除“。”,还有什么办法呢?

Ruby 1.9.2的最新变更不再生成当前目录. 你的LOAD_PATH一部分。 我有一个不重要的Rakefiles数量假设.LOAD_PATH一部分,所以这打破了他们(他们报告“没有这样的文件加载”的基于项目path的所有需求语句)。 有没有特别的理由呢?

至于解决方法,添加$: << "." 无处不在,但似乎令人难以置信的,我不想这样做。 什么是使我的Rakefiles 1.9.2 +兼容的首选方式?

这被认为是“安全”风险。

你可以通过使用绝对path绕过它

 File.expand_path(__FILE__) et al 

或做

 require './filename' (ironically). 

或通过使用

 require_relative 'filename' 

如果使用irb

 $irb -I . 

有两个原因:

  • 鲁棒性和
  • 安全

两者都基于相同的基本原理:一般来说,当您的代码运行时,您根本无法知道当前目录是什么。 这意味着,当你需要一个文件,并依赖它在当前目录中时,你无法控制该文件是否会在那里,或者它是否是你真正希望在那里的文件。

正如其他人所指出的,这是一个安全风险,因为. 在你的加载path中引用当前工作目录Dir.pwd ,而不是当前正在加载的文件的目录。 所以执行脚本的人可以简单地通过cd到另一个目录来改变它。 不好!

我一直使用从__FILE__构build的完整path作为替代。

 require File.expand_path(File.join(File.dirname(__FILE__), 'filename')) 

require_relative不同,它与Ruby 1.8.7向后兼容。

使用require_relative 'file_to_require'

把这个放在你的代码中,使1.8.7中的require_relative工作:

 unless Kernel.respond_to?(:require_relative) module Kernel def require_relative(path) require File.join(File.dirname(caller.first), path.to_str) end end end 

'' 在Unix的世界中,长久以来都被认为是一件坏事(例如, 参见http://www.faqs.org/faqs/unix-faq/faq/part2/section-13.html )。 我认为ruby的人已经被说服了不这样做的智慧。

我发现这是一个混乱的变化,直到我意识到一些事情。

您可以在.profile(Unix)中设置RUBYLIB,然后像以前一样继续下去:

export RUBYLIB="."

但如上所述,这样做一直被认为是不安全的。

对绝大多数情况你可以通过简单地用前缀'。'来调用你的Ruby脚本来避免问题。 例如./scripts/server。

正如JörgW Mittag指出的那样,我认为你要使用的是require_relative所以你需要的文件是相对于require声明的源文件而不是当前的工作目录。

你的依赖应该是相对于你的rake构build文件。