当前位置:  开发笔记 > 后端 > 正文

为什么Ruby 1.9.2删除"." 来自LOAD_PATH,有什么替代方案?

如何解决《为什么Ruby1.9.2删除"."来自LOAD_PATH,有什么替代方案?》经验,为你挑选了5个好方法。

Ruby 1.9.2的最新变更集不再使当前目录.成为您的目录LOAD_PATH.我有一些非常重要的Rakefiles假设它.是其中的一部分LOAD_PATH,所以这打破了它们(他们报告"没有这样的文件加载"所有基于项目路径的require语句).这样做有什么特别的理由吗?

至于一个修复,添加$: << "."到处都有效,但看起来非常h​​acky,我不想这样做.使Rakefiles 1.9.2+兼容的首选方法是什么?



1> rogerdpack..:

这被视为"安全"风险.

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

File.expand_path(__FILE__) et al

或做

require './filename' (ironically).

或者通过使用

require_relative 'filename'

或添加"包含"目录

ruby -I . ...

或者相同,使用irb;

$irb -I .


我用`require_relative`结束了.谢谢.
这类似于大多数unix,不包括运行可执行文件的路径中的当前目录吗?
`require'./ filename'`仅在脚本执行时,工作目录设置为脚本所在的同一目录.在多目录项目中通常不是这种情况.

2> Jörg W Mitta..:

有两个原因:

稳健性和

安全

两者都基于相同的基本原则:通常,在运行代码时,您根本无法知道当前目录是什么.这意味着,当您需要一个文件并依赖于它在当前目录中时,您无法控制该文件是否存在,或者它是否是您实际期望存在的文件.


@Joshua Cheek:另外,作为从`$ LOAD_PATH`中删除`.`的一种平衡,Ruby 1.9.2引入了`require_relative`,其中...... surprise ...`require`是一个相对于该位置的文件当前正在执行的文件(即相对于`File.dirname(__ FILE __)`).
我不认为强制执行这两个文件相对于彼此位于同一位置必然是一个不好的要求.如果这是真的,那么我们将无法使用目录.
@John Feminella:这与将文件相对于彼此放在路径中有什么关系?问题是将它们相对于`.`,即当前的工作目录.如果用户`cd`进入另一个目录,则当前工作目录会发生变化,现在你需要*完全*不同的文件,具体取决于用户在调用脚本时所遇到的目录.我认为这不是一个好主意.
@Joshua Cheek:就个人而言,我不喜欢这样.(但是请不要查看我的旧代码,因为它被散落在*那种东西:-)).我只是*假装*`lib`目录在`$ LOAD_PATH`上然后`require`所有相对于`lib`的文件.换句话说:我将它留给管理员来弄清楚如何正确设置`$ LOAD_PATH`.如果你使用RubyGems,这是微不足道的,因为RubyGems自动为你做*,如果你使用Debian软件包,那么它就是软件包维护者的工作.总而言之,它看起来非常好.

3> Jonathan Tra..:

正如其他人的回答指出的那样,这是一个安全风险,因为.在您的加载路径中引用了当前的工作目录Dir.pwd,而不是当前正在加载的文件的目录.因此,无论谁执行您的脚本,只需通过cd另一个目录即可更改.不好!

我一直在使用构建的完整路径__FILE__作为替代方案.

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

require_relative此不同,这与Ruby 1.8.7向后兼容.


还有这种变化(我个人觉得更易读):`require Pathname.new(__ FILE __).dirname +'filename'`

4> Tyler Brock..:

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



5> 小智..:

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

推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有