2010-06-19 9 views
5

Estoy haciendo una gema para uso interno. En él, me carga alguna YAML de otro directorio:¿Cómo puedo cargar archivos desde una ruta relativa específica en 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 

prefiero no dependen de la localización de data/root.yaml relativa a initializer.rb. En su lugar, prefiero obtener una referencia al <project_root> y depender de la ruta relativa desde allí, lo que parece un movimiento más inteligente.

En primer lugar, es que la mejor manera de ir sobre esto? Segundo, si es así, ¿cómo hago eso? Revisé los diversos métodos File, pero no creo que haya nada de eso. Estoy usando Ruby 1.9.

En este momento, crear una constante especial y confiar en que en su lugar:

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

pero no estoy seguro de que me gusta ese enfoque tampoco.

Respuesta

4

Si hay un archivo principal siempre se corre puede utilizar ese archivo como un punto de referencia. La ruta relativa (entre el directorio actual y) de ese archivo estará en $0, así que para obtener la ruta relativa a data/root.yaml (suponiendo que es la ruta relativa entre el archivo principal y root.yaml) lo hace

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

Esa es una buena idea, pero se rompería durante las pruebas, cuando a menudo realizo una prueba individual de las clases directamente en lugar de activar toda la pila de aplicaciones. Mi '$ 0 'sería diferente en tales casos (la ruta al corredor de prueba, no mi aplicación). –

+0

Envuelva la búsqueda en un objeto simple que pueda anular durante la prueba. – Theo

Cuestiones relacionadas