2010-06-19 5 views
5

Sto facendo un gioiello per uso interno. In esso, ho caricare alcuni YAML da un'altra directory:Come caricare i file da un percorso relativo specifico in 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 

Preferirei non dipende dalla posizione del data/root.yaml rispetto al initializer.rb. Invece, preferisco avere un riferimento a <project_root> e dipendere dal percorso relativo da lì, che sembra una mossa più intelligente.

In primo luogo, è il modo migliore per farlo? In secondo luogo, se sì, come faccio? Ho controllato i vari metodi File, ma non penso che ci sia qualcosa del genere. Sto usando Ruby 1.9.

In questo momento, creo una costante speciale e dipendere da quello invece:

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

ma non sono sicuro che mi piace questo approccio sia.

risposta

4

Se c'è un file principale che si esegue sempre è possibile utilizzare tale file come punto di riferimento. Il percorso relativo (tra la directory corrente e) di tale file sarà in $0, in modo da ottenere il percorso relativo alla data/root.yaml (partendo dal presupposto che è il percorso relativo tra il file principale e root.yaml) si fa

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

Questo è un buona idea, ma si romperà durante i test, quando spesso collaudo le classi direttamente piuttosto che accendere lo stack completo dell'applicazione. Il mio '$ 0' sarebbe diverso in questi casi (il percorso per il runner di test, non per la mia applicazione). –

+0

Completa la ricerca in un oggetto semplice che puoi eliminare durante il test. – Theo