2010-06-19 2 views
5

Je fais un bijou pour usage interne. Dans ce document, je charge un peu YAML dans un autre répertoire:Comment charger des fichiers à partir d'un chemin relatif spécifique dans Ruby?

# in <project_root>/bin/magicwand 
MagicWand::Configuration::Initializer.new(...) 

# in <project_root>/lib/magicwand/configuration/initializer.rb 
root_yaml = YAML.load_file(
    File.expand_path("../../../../data/#{RootFileName}", __FILE__)) 

# in <project_root>/data/root.yaml 
--- 
apple: 100 
banana: 200 
coconut: 300 

Je préfère ne pas dépendre de l'emplacement de data/root.yaml par rapport à initializer.rb. Au lieu de cela, je préfère obtenir une référence à <project_root> et dépend du chemin relatif à partir de là, ce qui semble être un mouvement plus intelligent.

D'abord, est-ce la meilleure façon de procéder? Deuxièmement, si oui, comment puis-je faire cela? J'ai vérifié les différentes méthodes File, mais je ne pense pas qu'il y ait quelque chose comme ça. J'utilise Ruby 1.9.

En ce moment, je crée une constante spéciale et dépendent de cette place:

# in lib/magicwand/magicwand.rb 
module MagicWand 
    # Project root directory. 
    ROOT = File.expand_path("../..", __FILE__) 
end 

mais je ne suis pas sûr que j'aime cette approche soit.

Répondre

4

S'il existe un fichier principal que vous exécutez toujours, vous pouvez utiliser ce fichier comme point de référence. Le chemin relatif (entre le répertoire courant et) de ce fichier sera $0, pour ainsi obtenir le chemin par rapport à data/root.yaml (en supposant que est le chemin relatif entre le fichier principal et root.yaml) vous

path_to_root_yaml = File.dirname($0) + '/data/root.yaml' 
+0

C'est une bonne idée, mais elle se briserait pendant les tests, quand je teste souvent les classes directement plutôt que de lancer la pile d'applications complète. Mon '$ 0' serait différent dans de tels cas (le chemin vers le coureur de test, pas mon application). –

+0

Enveloppez la recherche dans un objet simple que vous pouvez extraire pendant le test. – Theo

Questions connexes