Answers:
它被认为是“安全”风险。
您可以使用绝对路径绕过它
File.expand_path(__FILE__) et al
或做
require './filename' (ironically).
或使用
require_relative 'filename'
或添加“包含”目录
ruby -I . ...
或相同,使用irb;
$irb -I .
require './filename'
仅当您的脚本是在将工作目录设置为脚本所在的目录的情况下执行时才起作用。在多目录项目中通常不是这种情况。
有两个原因:
两者都基于相同的基本原理:通常,运行代码时,您根本不知道当前目录是什么。这意味着,当您需要一个文件并依赖于该文件位于当前目录中时,您将无法控制该文件甚至存在于该文件中,还是您实际上希望该文件存在于该文件中。
.
,即当前工作目录。如果用户cd
进入另一个目录,则当前的工作目录会更改,并且您现在将require
完全不同,这取决于用户调用脚本时所在的目录。我认为这不是一个好主意。
$: << File.dirname(__FILE__)
lib
目录上$LOAD_PATH
,然后require
相对于所有文件lib
。换句话说:我将其留给管理员来确定如何$LOAD_PATH
正确设置。如果您使用RubyGems,那将是微不足道的,因为RubyGems会自动为您执行此操作,并且如果您使用Debian软件包,那么这就是软件包维护者的工作。总而言之,它看起来效果很好。
.
从$LOAD_PATH
,红宝石1.9.2介绍require_relative
这... ...惊讶require
相对于当前正在执行的文件的位置SA文件(即,相对于File.dirname(__FILE__)
)。
正如其他答案所指出的那样,这存在安全隐患,因为.
在您的加载路径中引用的是当前工作目录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'
用 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人已经被说服了不这样做的智慧。
require_relative
。谢谢。