【发布时间】:2012-01-20 14:40:11
【问题描述】:
如何要求当前文件夹中的文件?
我有一个名为sql_parser.rb 的文件,其中包含一个类。我想将它包含在同一文件夹中的另一个文件中,所以我使用了:
require 'sql_parser'
当我从该文件夹运行时失败:
LoadError: no such file to load -- sql_parser
我尝试在此文件所在的文件夹中使用 IRB 并从那里要求它,但遇到了同样的问题。
【问题讨论】:
如何要求当前文件夹中的文件?
我有一个名为sql_parser.rb 的文件,其中包含一个类。我想将它包含在同一文件夹中的另一个文件中,所以我使用了:
require 'sql_parser'
当我从该文件夹运行时失败:
LoadError: no such file to load -- sql_parser
我尝试在此文件所在的文件夹中使用 IRB 并从那里要求它,但遇到了同样的问题。
【问题讨论】:
还有……
require "./myRubyFile" # 注意我们从 myRubyFile.rb 中排除了 .rb
【讨论】:
$LOAD_PATH << Dir.pwd
require 'sql_parser'
正如@AndrewGrimm 所说,出于安全原因,您应该改用它:
$LOAD_PATH << File.join(File.dirname(__FILE__))
require 'sql_parser'
您的目录必须位于当前加载路径中。加载路径存储在名为$LOAD_PATH 的全局数组中。如果将当前目录附加到它,则可以使用 require 加载目录中的任何文件。
按照 Tin Man 的建议,使用 Dir.pwd 而不是 pwd.chomp
我更喜欢这个而不是 require_relative 除非你有一个非常小的项目,否则事情会变得丑陋。
【讨论】:
Dir.pwd 可能更直接,因为它不需要打开子shell 或chomp 结果。此外,对于 1.9+,require_relative './sql_parser' 或 require_relative 'sql_parser' 将是我将如何去做
$LOAD_PATH << Dir.pwd 比$LOAD_PATH << "." 更不安全吗?至少对于后者,您知道自己在做一些不安全的事情。
使用
$:.unshift File.join(File.dirname(__FILE__))
确保您获得的路径基于脚本所在的位置,而不是程序的执行位置。否则,您将放弃通过从加载路径中删除 "." 获得的安全优势。
(是的,问题的标题谈到在运行脚本的目录中需要一个文件,但问题的主体提到所需的文件与相关脚本位于同一文件夹中)
【讨论】:
require_relative。对于那些关心的人,这是加载文件的正确方法
正如该问题的其他答案所说,在 1.9 中,语法更改为 require_relative。
如果您使用 Ruby 1.8 编写代码,我建议您以前瞻性的方式编写代码,并使用require_relative gem,这样您就可以在 Ruby 1.8 中使用这个关键字,并在您迁移到1.9
【讨论】:
在 ruby 1.9.x 中,您可以使用方法require_relative。见http://www.ruby-doc.org/core-1.9.3/Kernel.html#method-i-require_relative。
【讨论】: