2012-07-23 12 views
7

sé que puedo exigir a todos los ficheros de un directorio utilizando¿Cómo se requieren todos los archivos en un directorio, en una joya?

Dir['path/to/files/**/*.rb'].each { |file| require file } 

Sin embargo, yo estoy tratando de hacer que un archivo de instalación de la gema, así:

class MyGem 
    module NS; end 
end 

Dir['lib/my_gem/files/**/*.rb'].each { |file| require file } 

(donde todo el los archivos en lib/my_gem/files son espacios de nombre en MyGem :: NS). Con una estructura de directorios que tiene este aspecto:

lib        
|-- my_gem       
| |-- files    
| | |-- file1.rb  
| | |-- file2.rb   
| | |-- file3.rb   
| | `-- ... (many more)  
`-- my_gem.rb      
my_gem.gemspec 

Y, bueno, no parece el comando Dir a trabajar cuando requiero mi joya en otro archivo, ya que parece que buscar las rutas de archivos en tiempo de ejecución en mi raíz de proyecto (de cualquier proyecto que haya requerido mi gema).

¿Cómo puedo solicitar todos los archivos en lib/my_gem/files en lib/my_gem.rb?

Respuesta

11

Rubygems tiene una instalación llamada find_files que permitirá buscar cualquier cosa basada en la ruta de carga:

Gem.find_files("my_gem/files/**/*.rb").each { |path| require path } 
+0

+1 ¡Justo lo que estaba buscando! – neezer

+0

Esto encuentra todos los archivos rb y no solo los principales, como con cada gema debes tener una sola declaración de requerimiento para incluir esa gema en la aplicación, no necesitas requerir todos los archivos uno por uno, sino uno solo –

-1

Puede hacer una búsqueda recursiva usando find y luego ejecute la lista de respuestas e inclúyalas línea por línea.

algo así como

`find #{root_path}/lib/my_gem/files/**/*.rb`.split("\n").each { |p| require p } 
+0

esto no sería un enfoque multi-plataforma. –

Cuestiones relacionadas