如何判断这里需要哪个文件?

时间:2017-08-15 14:07:16

标签: ruby

我正在阅读Homebrew仓库的代码库,特别是这里的文件:

https://github.com/Homebrew/brew/blob/8518ffdee19c0c985e8631e836b78624e4926c7f/Library/Homebrew/brew.rb

我看到许多'require'语句散布在整个文件中,例如第104行(require 'tap')。问题是我在代码库中看到3个名为tap.rb的文件:

Library/Homebrew/tap.rb Library/Homebrew/cmd/tap.rb Library/Homebrew/compat/tap.rb

在代码的下方我看到Tap.fetch...,在Library/Homebrew/tap.rb中包含一个名为Tap的类,其类方法名为fetch,所以我对此有信心是包含的正确文件。但可以想象,可能有数十个具有相同文件名的文件,其中不止一个文件具有相同的类方法。我的问题是,有没有办法告诉你加载哪个Tap类而不查看每个文件?

更新:我想我的答案可以解答(见下文)。

2 个答案:

答案 0 :(得分:0)

我发现了require如何在Ruby中运行的很好的解释:

https://github.com/ericmathison/articles/blob/master/understaning-require-in-ruby.md

本质上,它通过查看Ruby $LOAD_PATH方法起作用,类似于UNIX在CLI中接收命令时使用$ PATH变量查找二进制可执行文件的方式。我能够通过在同一目录中创建两个文件来测试我的本地,如下所示:

# file number 1- foobar.rb 

module Foobar
  module_function

  def bar
    p "foo" 
  end

end

# file number 2- foobaz.rb

$LOAD_PATH.unshift(".")

class Foobaz

  def baz
    require 'foobar'
    p Foobar.bar
  end

end

Foobaz.new.baz

如果没有foobaz.rb中的行$LOAD_PATH.unshift("."),代码就不会使用简单的require 'foobar'语句执行。我不得不使用require_relative 'foobar.rb'。但是将当前工作目录添加到$ LOAD_PATH环境变量意味着我现在可以访问当前目录中的所有ruby文件,所以它已经执行了!

注意 - 将.添加到$LOAD_PATH可能应该放在某个配置文件中,而不是放在与require语句相同的文件中。

答案 1 :(得分:0)

如果您在binding.pry之前加require并执行$:,那将是需要查找'tap.rb'文件的目录列表。

参见require的定义: If the filename does not resolve to an absolute path, it will be searched for in the directories listed in $:.