2017-08-15 1 views
0

Ich bin durch die Code-Basis der Homebrew-Repo zu lesen, insbesondere die Datei hier:Wie kann ich feststellen, welche Datei hier benötigt wird?

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

Ich sehe viele ‚require‘ Aussagen in der gesamten Datei verstreut, zum Beispiel auf der Leitung 104 (require 'tap'). Das Problem ist, dass ich sehe, 3 Dateien tap.rb in der Code-Basis genannt:

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

Weiter unten im Code I Tap.fetch... und in Library/Homebrew/tap.rb sehen, welche eine Klasse Tap mit einer Klassenmethode namens enthält benannt fetch, also bin ich zuversichtlich, dass dies die richtige Datei ist, die enthalten ist. Denkbar wäre aber, dass es Dutzende von Dateien mit demselben Dateinamen geben könnte, und mehr als eine davon könnte identische Klassenmethoden haben. Meine Frage ist, gibt es eine Möglichkeit zu sagen, welche Tap-Klasse geladen wird, ohne durch jede der Dateien zu schauen?

UPDATE: Ich denke, ich habe die Antwort auf meine Frage (siehe unten).

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

Im Grunde funktioniert es, indem man die Ruby-$LOAD_PATH Methode, ähnlich wie UNIX verwendet das $ PATH-Variable für binäre aussehen:

+0

Die Datei geladen ist 'Library/Homebrew/tap.rb'. 'Library/Homebrew/cmd/tap.rb' enthält den Code, der den Befehl' brew tap' behandelt. Es wird explizit in [Zeile 61] (https://github.com/Homebrew/brew/blob/8518ffdee19c0c985e8631e836b78624e4926c7f/Library/Homebrew/brew.rb#L61) geladen, wenn "tap" der Homebrew-Befehl in der Befehlszeile ist ('Brühen tippen ...'). – axiac

Antwort

0

ich diese große Erklärung, wie require Werke in Ruby gefunden ausführbare Dateien, wenn ein Befehl in der CLI empfangen wird. Ich konnte dies, indem sie zwei Dateien im selben Verzeichnis auf meinem lokalen testen, etwa so:

# 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 

Ohne die Linie $LOAD_PATH.unshift(".") in foobaz.rb, würde der Code nicht mit der einfachen require 'foobar' Anweisung ausführen. Ich musste stattdessen require_relative 'foobar.rb' verwenden. Aber das Hinzufügen des aktuellen Arbeitsverzeichnisses zur Umgebungsvariablen $ LOAD_PATH bedeutete, dass ich nun Zugriff auf alle Ruby-Dateien im aktuellen Verzeichnis hatte, also ausgeführt!

NB- es ist wahrscheinlich, dass das Hinzufügen . zu der $LOAD_PATH in eine Konfigurationsdatei irgendwo, nicht in der gleichen Datei wie die Anweisung gehen sollte.

0

Wenn Sie eine binding.pry vor der require setzen und $: ausführen, wird das die Liste der Verzeichnisse sein, in denen die required die 'tap.rb' Dateien nachschlagen wird.

Siehe Definition erfordern: If the filename does not resolve to an absolute path, it will be searched for in the directories listed in $:.

Verwandte Themen