Ruby 1.9.2的最新变更集不再使当前目录.
成为您的目录LOAD_PATH
.我有一些非常重要的Rakefiles假设它.
是其中的一部分LOAD_PATH
,所以这打破了它们(他们报告"没有这样的文件加载"所有基于项目路径的require语句).这样做有什么特别的理由吗?
至于一个修复,添加$: << "."
到处都有效,但看起来非常hacky,我不想这样做.使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人已经被说服了不这样做的智慧.