2009-01-06 7 views
5

Voici une question de débutant:Comment Ruby sait-elle où trouver le fichier requis?

require 'tasks/rails' 

je vis cette ligne dans Rakefile dans le chemin racine de chaque projet rails. Je suppose que cette ligne est utilisée pour exiger fournisseur/rails/railties/lib/tâches/rails.rb pour obtenir toutes les tâches de râteau chargées:

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

Ma question est pourquoi seulement « tâches/rails » est spécifié pour le besoin méthode, mais pas le chemin complet du fichier?

Merci d'avance.

Répondre

13

Lorsque vous démarrez vos rails application, il s'exécute config/boot.rb qui appelle Rails::Initializer.set_load_path et thatsets le $LOAD_PATH . Ruby utilise cette liste de répertoires pour trouver les fichiers spécifiés sur une ligne de require. Si vous lui donnez un chemin absolu comme require '/home/lolindrath/ruby/lib.rb', il passera cette recherche.

Ceci est à peu près analogue à #include <stdlib.h> en C/C++ où il recherche le chemin d'inclusion que vous donnez au compilateur pour trouver ce fichier d'en-tête.

+0

[Lien de travail] (https://github.com/rails/rails/blob/2-3-stable/railties/lib/initializer.rb#L240) à 'set_load_path' de Rails 2.3. (Le numéro de ligne peut changer, mais le fichier ne le sera probablement pas.) (Je ne sais pas où Rails 3 met le même code.) –

1

Je crois parce que vos chemins sont mis en place dans votre fichier /config/environment.rb:

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

Je ne comprends pas, pourriez-vous s'il vous plaît être plus précis? – eric2323223

+0

Cela obtient le nom de fichier du script en cours d'exécution, il obtient le répertoire dans lequel réside le fichier en utilisant File.dirname et lui ajoute un nouveau fichier (ie un fichier que vous connaissez est dans le même répertoire mais pas dans $ LOAD_PATH). Ensuite, File.join crée le nouveau nom de fichier en toute sécurité. – Lolindrath

0

Bien sûr. Dans /config/boot.rb (appelé environment.rb) le RAILS_ROOT est configuré comme ceci:

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

Ce qui vous permet de demander des choses à partir de la racine, je crois. J'espère que c'est la réponse de toute façon!