2010-03-21 7 views
20

Al crear gemas, a menudo tienen una estructura de directorios como esto:manera más limpia/de una sola línea para requerir todos los archivos en el directorio en Ruby?

|--lib 
    |-- helpers.rb 
    `-- helpers 
     |-- helper_a.rb 
     `-- helper_b.rb 

Dentro de la helpers.rb, yo sólo estoy require -ing los archivos en el directorio helpers. Pero tengo que hacer cosas como esta:

$:.push(File.dirname(__FILE__) + '/helpers') 
require 'helper_a' 
require 'helper_b' 

¿Hay una manera de hacer que una línea de modo que nunca tenga que añadir a ella? Me acabo de ocurrir esto muy rápido:

dir = File.join(File.dirname(__FILE__), "helpers") 
Dir.entries(dir)[2..-1].each { |file| require "#{dir}/#{file[0..-4]}" } 

Pero es dos líneas y feo. ¿Qué astutos trucos has hecho para que este sea un trazador de líneas único?

+1

duplicados de http://stackoverflow.com/questions/735073/best- way-to-require-all-files-from-a-directory-in-ruby - use 'Dir ["/ruta/a/directorio/*. rb "]. cada {| archivo | require file} ' –

+0

Aún mejor, usa la gema require_all mencionada en esa pregunta. – clacke

Respuesta

50
project_root = File.dirname(File.absolute_path(__FILE__)) 
Dir.glob(project_root + '/helpers/*') {|file| require file} 

O al golf un poco más:

Dir.glob(project_root + '/helpers/*', &method(:require)) 
+0

sí, eso está enfermo. gracias hombre. –

+0

No hubiera pensado en el método # to_proc, ¡lindo! – severin

+0

Hubiera necesitado para comprender comodines ... pero +1 y gracias por el tiempo que me has guardado ...: D – Stefan

0

Hola la manera más limpia que he descubierto es utilizar Dir.glob con comodines.

poner lo siguiente en su Rakefile:

gem.files = Dir.glob('lib/**/ *.rb') 

Se debe trabajar un convite.

+2

Esto no respondió la pregunta sobre el uso de require. – phatmann

3

me gusta require_relative:

Dir.glob('lib/**/*.rb') { |f| require_relative f } 

El `& método (: require_relative) truco no funcionará con require_relative. Me sale:

`require_relative': cannot infer basepath (LoadError) 

pero sí ahorra el tiempo de computación project_root

estoy usando ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.5.0]

+0

relacionado: https://bugs.ruby-lang.org/issues/4487 – quinn

0
# helpers.rb 
Dir[__dir__ + '/helpers/*'].each &method(:require) 
Cuestiones relacionadas