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 如何知道在哪里可以找到所需的文件?的主要内容,如果未能解决你的问题,请参考以下文章