2009-01-06 8 views
5

Hier ist eine weitere Neuling Frage:Woher weiß Ruby, wo eine benötigte Datei zu finden ist?

require 'tasks/rails' 

sah ich diese Linie in Rakefile im Wurzelpfad jedes Schienen-Projekt. Ich denke, diese Linie verwendet wird, Verkäufer/Schienen/railties/lib/Aufgaben/rails.rb zu verlangen, dass alle Rake Aufgaben geladen zu bekommen:

$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 } 

Meine Frage ist, warum nur die Aufgaben/rails 'für die angegeben ist erforderlich Methode, aber nicht den vollständigen Pfad der Datei?

Vielen Dank im Voraus.

Antwort

13

Wenn Sie Ihre Rails-Anwendung starten Sie es läuft config/boot.rb die Rails::Initializer.set_load_path nennt und thatsets bis die $LOAD_PATH .

Ruby verwendet diese Liste von Verzeichnissen, um die in einer -Zeile angegebenen Dateien zu finden. Wenn Sie einen absoluten Pfad wie require '/home/lolindrath/ruby/lib.rb' eingeben, wird diese Suche übersprungen.

Dies entspricht ungefähr #include <stdlib.h> in C/C++, wo es den Include-Pfad durchsucht, den Sie dem Compiler geben, um diese Header-Datei zu finden.

+0

[Arbeitslink] (https://github.com/rails/rails/blob/2-3-stable/railties/lib/initializer.rb#L240) zu "set_load_path" von Rails 2.3. (Die Zeilennummer kann sich ändern, aber die Datei wird wahrscheinlich nicht.) (Ich weiß nicht, wo Rails 3 denselben Code einfügt.) –

1

Ich glaube, da die Pfade in Ihrem /config/environment.rb-Datei:

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

Ich verstehe nicht, könnten Sie bitte genauer sein? – eric2323223

+0

Dadurch wird der Dateiname des gerade ausgeführten Skripts abgerufen, das Verzeichnis wird abgerufen, in dem File.dirname verwendet wird, und dann wird eine neue Datei angehängt (dh, eine Datei, von der Sie wissen, befindet sich im selben Verzeichnis, aber nicht im $ LOAD_PATH). Dann macht File.join sicher den neuen Dateinamen. – Lolindrath

0

Sicher. In /config/boot.rb (in environment.rb genannt) die RAILS_ROOT als so ein:

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

Welche Sie Dinge von der Wurzel verlangen kann, glaube ich. Hoffe, das ist die Antwort sowieso!

Verwandte Themen