2017-08-15 60 views
0

我在這裏讀通過家釀回購的代碼庫,特別是文件:如何判斷哪個文件需要在這裏?

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

我看到散落在衆多的文件「要求」語句,例如在線路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其中包含一個名爲類方法命名Tapfetch,所以我確信這是包含的正確文件。但可以想象,可能有數十個文件具有相同的文件名,並且其中多個文件可能具有相同的類方法。我的問題是,有沒有辦法告訴哪個Tap類正在被加載而沒有查看每個文件?

更新:我想我有我的問題的答案(見下文)。

+0

文件加載有'庫/家釀/ tap.rb'。 'Library/Homebrew/cmd/tap.rb'包含處理'brew tap'命令的代碼。當'tap'是在命令行中提供的Homebrew命令時,它被明確加載到[line 61](https://github.com/Homebrew/brew/blob/8518ffdee19c0c985e8631e836b78624e4926c7f/Library/Homebrew/brew.rb#L61) '釀造水龍頭...')。 – axiac

回答

0

我發現如何require作品在Ruby中這很好的解釋:

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

從本質上講,它的工作原理是在看紅寶石$LOAD_PATH方法,類似於UNIX如何使用$ PATH變量來尋找二進制當它在CLI中接收到一個命令時可執行文件。我能夠在同一目錄做兩個文件,以測試這一點上我的地方,像這樣:

# 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文件,因此它可以執行!

NB-很可能將.添加到$LOAD_PATH應該放在某個配置文件中,而不是在與require語句相同的文件中。

0

如果你在require之前加上binding.pry,並執行$:這將成爲require查找'tap.rb'文件的目錄列表。

見的定義要求: If the filename does not resolve to an absolute path, it will be searched for in the directories listed in $:.

相關問題