到Ruby 1.9.2的最新变更不再使当前目录.
你的一部分LOAD_PATH
。 我有一个假设Rakefiles的不平凡的数量.
是的一部分LOAD_PATH
,所以这打破了他们(他们的报告“没有这样的文件来加载”为所有需要关闭的基于项目的路径语句)。 是否有这样做的一个特殊的理由?
至于修复,增加$: << "."
无处不在的作品,但似乎令人难以置信的哈克,我不想这样做。 什么是让我Rakefiles 1.9.2+兼容的首选方式?
到Ruby 1.9.2的最新变更不再使当前目录.
你的一部分LOAD_PATH
。 我有一个假设Rakefiles的不平凡的数量.
是的一部分LOAD_PATH
,所以这打破了他们(他们的报告“没有这样的文件来加载”为所有需要关闭的基于项目的路径语句)。 是否有这样做的一个特殊的理由?
至于修复,增加$: << "."
无处不在的作品,但似乎令人难以置信的哈克,我不想这样做。 什么是让我Rakefiles 1.9.2+兼容的首选方式?
它被认为是一个“安全”的风险。
您可以通过使用绝对路径绕过它
File.expand_path(__FILE__) et al
或做
require './filename' (ironically).
或者使用
require_relative 'filename'
或添加“包括”目录
ruby -I . ...
或相同,使用IRB;
$irb -I .
有两个原因:
两者都基于相同的基本原则:一般情况下,你根本无法知道当前目录是什么,在运行代码时。 这意味着,当你需要一个文件,并依赖于它在当前目录是,你有没有控制该文件是否会甚至在那里,或者它是否是你真正希望是有文件的方式。
正如其他答案指出,这是因为安全风险.
在您的负载路径是指当前的工作目录Dir.pwd
,而不是当前文件的目录加载。 所以,不管是谁执行你的脚本可以通过简单地改变这种cd
荷兰国际集团到另一个目录。 不好!
我一直在使用从构建的完整路径__FILE__
作为替代。
require File.expand_path(File.join(File.dirname(__FILE__), 'filename'))
不像require_relative
,这是用Ruby 1.8.7向后兼容。
使用require_relative 'file_to_require'
在你的代码抛出这样做require_relative工作1.8.7:
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。
作为约尔格W¯¯米塔格指出的那样,我想你想使用什么是require_relative
所以您需要的文件是相对的源文件require
申报,而不是当前的工作目录。
你的相关性都应当相对于你耙构建文件。