如何要求来自另一个目录的 ruby​​ 文件

Posted

技术标签:

【中文标题】如何要求来自另一个目录的 ruby​​ 文件【英文标题】:How to require a ruby file from another directory 【发布时间】:2013-05-27 05:07:27 【问题描述】:

我试图要求一个我在另一个文件中创建的 rake 文件。这两个文件位于两个不同的目录中。我在我的第一个文件的顶部有要求,要求后的引号内有第二个文件的名称。 它告诉我它无法加载这样的文件。 这是否意味着因为它在不同的目录中找不到它? 我尝试保留第二个文件的完整路径,但它仍然无法加载该文件。 有谁知道我如何将第二个文件加载到第一个文件中?

提前致谢

【问题讨论】:

你试过require 'directory/other_file'吗? 是的,我试过了。我给了它完整的路径,但仍然无法加载它 【参考方案1】:

require 将仅在称为“加载路径”的一组位置中搜索文件。您可以在脚本或 irb 会话中使用全局变量 $LOAD_PATH 查看加载路径。如果它不在加载路径中,它将找不到它。

Ruby 1.9 引入了require_relative,它使用当前文件的位置作为起点进行搜索。

# Will search $LOAD_PATH for file. 
require 'test/unit'
# Notice the '/' which tells it to look in the 
# 'test' folder for a file named 'unit.rb'

# Will look in current folder of file
require_relative 'my_folder/my_file'
# Will search in 'my_folder' for the file 'my_file.rb'

请注意,require_relative 在 irb 中不起作用。

另外请注意,如果您真的想使用require,您可以通过将位置添加到$LOAD_PATH 变量来启动您的脚本。

$LOAD_PATH << File.join('users', 'yourusername', 'your_folder')
# or
$LOAD_PATH << File.dirname(__FILE__)
# The second one enables you to move the file around on your
# system and still operate correctly
require 'my_file'

这里有一些来自 Ruby-Doc 的附加文档:

$LOAD_PATH require require_relative File.dirname __FILE__

【讨论】:

感谢您的精彩回答,但只有一个问题,括号内的内容是什么?是用户名、用户名和文件夹的文件路径 这只是一个例子。我用它作为示例 Linux 的主目录。它可以很容易地成为File.join('C:', 'Users', 'Charles', 'blahblah') 甚至File.dirname(__FILE__),它将当前文件所在的文件夹添加到加载路径中。 dirname 可能更好,因为它可以让您移动文件并且仍然可以工作。 您的 Rake 文件是以“.rb”还是“.rake”结尾的? require 只查找“.rb”。如果它以 '.rake' 结尾,那么您可以考虑查看 this SO question,它谈到了使用 import 不客气。有一个blog by Glenn Gentzke 提到了与 SO 问题基本完全相同的事情。有趣的难题。 可能是愚蠢的问题,但是当我尝试导入 .rake 文件时出现未定义的方法“导入”错误。你知道答案吗?我需要包含一些东西吗?【参考方案2】:

也可以这样做:

require './something.rb'

从当前目录到包含。

【讨论】:

【参考方案3】:

来自文档:它建议使用 require relative。 Docs

require_relative 是对内置方法 require 的补充,它允许您加载与包含 require_relative 语句的文件相关的文件。

当您使用require 加载文件时,您通常会访问系统中已正确安装并可以访问的功能。 require 没有为在项目代码中加载文件提供一个好的解决方案。这在开发阶段可能很有用,可用于访问测试数据,甚至可用于访问“锁定”在项目内部、不打算供外部使用的文件。

例如,如果您在“test”目录中有单元测试类,并且在测试“test/data”目录中有它们的数据,那么您可以在测试用例中使用如下行:

require_relative "data/customer_data_1"

【讨论】:

【参考方案4】:

例如,您有文件:

chess.rb 和 spec/test.rb

并且您想要求 spec/test.rb 中的文件。使用:

require_relative '../test.rb'

带有两个点。使用一个点 './' 会出现错误“无法加载此类文件”

【讨论】:

或 require_relative '../test'

以上是关于如何要求来自另一个目录的 ruby​​ 文件的主要内容,如果未能解决你的问题,请参考以下文章

ruby 在目录中加载多个文件并要求它们

要求Ruby目录中所有文件的最干净/单线方法?

扫描并要求目录中的Ruby文件

是否有更短的方法来要求 ruby​​ 中同一目录中的文件?

ruby:如何正确地要求(避免循环依赖)

Ruby:自定义 gem 需要其中的模块“要求”