为什么红宝石1.9.2中删除“”从LOAD_PATH,这有什么办法呢?为什么红宝石1.9.2中删除“

2019-05-10 11:19发布

到Ruby 1.9.2的最新变更不再使当前目录. 你的一部分LOAD_PATH 。 我有一个假设Rakefiles的不平凡的数量. 是的一部分LOAD_PATH ,所以这打破了他们(他们的报告“没有这样的文件来加载”为所有需要关闭的基于项目的路径语句)。 是否有这样做的一个特殊的理由?

至于修复,增加$: << "." 无处不在的作品,但似乎令人难以置信的哈​​克,我不想这样做。 什么是让我Rakefiles 1.9.2+兼容的首选方式?

Answer 1:

它被认为是一个“安全”的风险。

您可以通过使用绝对路径绕过它

File.expand_path(__FILE__) et al

或做

require './filename' (ironically).

或者使用

require_relative 'filename'

或添加“包括”目录

ruby -I . ...

或相同,使用IRB;

$irb -I .


Answer 2:

有两个原因:

  • 鲁棒性和
  • 安全

两者都基于相同的基本原则:一般情况下,你根本无法知道当前目录是什么,在运行代码时。 这意味着,当你需要一个文件,并依赖于它在当前目录是,你有没有控制该文件是否会甚至在那里,或者它是否是你真正希望是有文件的方式。



Answer 3:

正如其他答案指出,这是因为安全风险. 在您的负载路径是指当前的工作目录Dir.pwd ,而不是当前文件的目录加载。 所以,不管是谁执行你的脚本可以通过简单地改变这种cd荷兰国际集团到另一个目录。 不好!

我一直在使用从构建的完整路径__FILE__作为替代。

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

不像require_relative ,这是用Ruby 1.8.7向后兼容。



Answer 4:

使用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


Answer 5:

'' 在你的路径一直被认为是在Unix世界坏事(见,例如, http://www.faqs.org/faqs/unix-faq/faq/part2/section-13.html )。 我认为Ruby的人被说服的不是这样做的智慧。



Answer 6:

我发现这是一个混杂的变化,直到我认识一对夫妇的事情。

你可以在你的.profile文件(UNIX)设置RUBYLIB和之前一样生活下去:

export RUBYLIB="."

但正如上面提到的,它一直被认为不安全的这样做。

对于绝大多数情况下,你可以通过简单地用一个前置的呼唤你的Ruby脚本避免出现问题“” 例如./scripts/server。



Answer 7:

作为约尔格W¯¯米塔格指出的那样,我想你想使用什么是require_relative所以您需要的文件是相对的源文件require申报,而不是当前的工作目录。

你的相关性都应当相对于你耙构建文件。



文章来源: Why does Ruby 1.9.2 remove “.” from LOAD_PATH, and what's the alternative?