为什么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文件。