Ruby 如何知道在哪里可以找到所需的文件?

Posted

技术标签:

【中文标题】Ruby 如何知道在哪里可以找到所需的文件?【英文标题】:How does Ruby know where to find a required file? 【发布时间】:2010-09-29 20:27:01 【问题描述】:

这里还有一个新手问题:

require 'tasks/rails'

我在每个 rails 项目的根路径中的 Rakefile 中都看到了这一行。我猜这行是用来要求 vendor/rails/railties/lib/tasks/rails.rb 来加载所有 rake 任务:

$VERBOSE = nil
# Load Rails rakefile extensions
Dir["#File.dirname(__FILE__)/*.rake"].each  |ext| load ext 
# Load any custom rakefile extensions
Dir["#RAILS_ROOT/lib/tasks/**/*.rake"].sort.each  |ext| load ext 
Dir["#RAILS_ROOT/vendor/plugins/*/**/tasks/**/*.rake"].sort.each  |ext| load ext 

我的问题是为什么只为 require 方法指定了“tasks/rails”,而不是文件的完整路径?

提前致谢。

【问题讨论】:

【参考方案1】:

当你启动你的 Rails 应用程序时,它会运行 config/boot.rb,它会调用 Rails::Initializer.set_load_path 并设置 $LOAD_PATH

Ruby 使用该目录列表来查找在require 行中指定的文件。如果你给它一个像require '/home/lolindrath/ruby/lib.rb' 这样的绝对路径,它会跳过那个搜索。

这与 C/C++ 中的 #include <stdlib.h> 大致相似,在 C/C++ 中,它会搜索您为编译器提供的包含路径以找到该头文件。

【讨论】:

Working link 到 Rails 2.3 的 set_load_path。 (行号可能会改变,但文件可能不会。)(我不知道 Rails 3 把相同的代码放在哪里。)【参考方案2】:

我相信是因为您的路径是在您的 /config/environment.rb 文件中设置的:

require File.join(File.dirname(__FILE__), 'boot')

【讨论】:

我不明白,能否请您说的更具体一点? 获取当前运行的脚本的文件名,使用 File.dirname 获取文件所在的目录,然后将一个新文件附加到它(即需要一个您知道在同一目录中的文件)目录但不在 $LOAD_PATH 中)。然后 File.join 安全地生成新文件名。【参考方案3】:

当然。在 /config/boot.rb(在 environment.rb 中调用)中,RAILS_ROOT 设置如下:

RAILS_ROOT = "#File.dirname(__FILE__)/.." unless defined?(RAILS_ROOT)

我相信这可以让你从根本上要求东西。无论如何,希望这就是答案!

【讨论】:

以上是关于Ruby 如何知道在哪里可以找到所需的文件?的主要内容,如果未能解决你的问题,请参考以下文章

Scala / Gradle 项目...在哪里存储单元测试所需的超大文件?

如何添加OAuth请求下载文件所需的权限?

在线接受支付时在哪里可以找到不同卡所需的参数

查看器无法找到呈现报告所需的资源

在哪里可以找到连接点名称以访问 FileNet 流程引擎

查找读取 1000 字节文件所需的时间 [关闭]