¿Cuál es la mejor manera de requerir todos los archivos de un directorio en ruby?¿La mejor manera de requerir todos los archivos de un directorio en ruby?
Respuesta
¿Qué tal:
Dir["/path/to/directory/*.rb"].each {|file| require file }
Tendrá que soltar el .rb antes de requerirlo. Bueno aparte de eso – rampion
De acuerdo con el Pico, la extensión .rb es opcional. Técnicamente, cambia el significado: "require 'foo.rb'" requiere foo.rb, mientras que "require 'foo'" puede requerir foo.rb, foo.so o foo.dll. –
Hay un sutil intento de no eliminar la extensión. Si alguna otra parte de las llamadas al código requiere 'foo', entonces ruby cargará el mismo archivo nuevamente, lo que puede conducir a errores espurios. Agregué mi propia respuesta que explica eso y muestra cómo quitar la extensión. –
Si se trata de un directorio en relación con el archivo que hace lo requiere (por ejemplo, que desea cargar todos los archivos en el directorio lib):
Dir[File.dirname(__FILE__) + '/lib/*.rb'].each {|file| require file }
También puede agregar todos los directorios secundarios como este' Dir [File.dirname (__ FILE__) + '/support/**/*.rb'].each {| file | requerir archivo} ' – jspooner
Probablemente sea más seguro usar File.join en lugar de hacer suposiciones sobre barras hacia adelante/hacia atrás:' Dir [File.join (File.dirname (__ FILE__), 'lib', '* .rb')]. each {| archivo | requiere archivo} ' – Chris
@ChristopherPatuzzo usted es un protector de la vida. No pude entender por qué los archivos nunca se cargaron. "\ current \ file \ path/lib/*.rb " – clementine
La mejor manera de es agregar el directorio a la ruta de carga y luego require
el nombre base de cada archivo. Esto se debe a que desea evitar accidentalmente requerir el mismo archivo dos veces, a menudo no el comportamiento previsto. Si un archivo se cargará o no dependerá de si require
ha visto la ruta que se le pasó anteriormente. Por ejemplo, esta simple sesión de IRB muestra que puede requerir y cargar por error el mismo archivo dos veces.
$ irb
irb(main):001:0> require 'test'
=> true
irb(main):002:0> require './test'
=> true
irb(main):003:0> require './test.rb'
=> false
irb(main):004:0> require 'test'
=> false
Tenga en cuenta que las dos primeras líneas de retorno true
es decir, el mismo archivo se cargó en ambas ocasiones. Cuando se utilizan rutas, incluso si las rutas apuntan a la misma ubicación, require
no sabe que el archivo ya era necesario.
Aquí, en cambio, agregamos un directorio a la ruta de carga y luego solicitamos el nombre base de cada archivo * .rb dentro.
dir = "/path/to/directory"
$LOAD_PATH.unshift(dir)
Dir[File.join(dir, "*.rb")].each {|file| require File.basename(file) }
Si no se preocupan por el archivo que se requiere más de una vez, o su intención es sólo para cargar el contenido del archivo, tal vez load
se debe utilizar en lugar de require
. Use carga en este caso, porque expresa mejor lo que está tratando de lograr. Por ejemplo:
Dir["/path/to/directory/*.rb"].each {|file| load file }
Pruebe la gema require_all:
Le permite simplemente:
require_all 'path/to/directory'
Usted, señor, es increíble para hacerlo y asombroso para publicar un enlace aquí. Sin embargo, el enlace está rancio en estos días. La gema ahora se puede encontrar en https://rubygems.org/gems/require_all y http : //github.com/jarmo/require_all. – clacke
@clacke Agregué tus enlaces a la respuesta original, gracias por el comentario. –
Necesitaba incluir todos mis modelos ActiveRecord, la gema require_all averiguó todas las dependencias y requería ellos perfectamente. ¡Gracias! – panupan
Dir[File.dirname(__FILE__) + '/../lib/*.rb'].each do |file|
require File.basename(file, File.extname(file))
end
Si no quita la extensión, puede terminar requiriendo el mismo archivo dos veces (ruby no se dará cuenta de que "foo" y "foo.rb" son el mismo archivo). Solicitar dos veces el mismo archivo puede generar advertencias falsas (por ejemplo, "advertencia: constante ya inicializada").
¿Es este realmente el caso? La documentación dice: Una característica no se cargará si su nombre ya aparece en $ ". El nombre del archivo se convierte en una ruta absoluta, por lo que" require 'a'; require './a' "no cargará a.rb dos veces. http://www.ruby-doc.org/core/classes/Kernel.html#M001418 – Derek
Mi prueba muestra lo mismo que Derek dijo:' require 'foo .rb "; require" foo ";' cargará 'foo.rb' solo una vez. –
@ PeteHodgson- ¿Puedes respaldar esto? – Yarin
Dir[File.join(__dir__, "/app/**/*.rb")].each do |file|
require file
end
Esto funcionará recursivamente en su máquina local y un control remoto (como Heroku) que no utiliza rutas relativas.
Dir.glob(File.join('path', '**', '*.rb'), &method(:require))
o, alternativamente, si se desea alcance los archivos para cargar en las carpetas específicas:
Dir.glob(File.join('path', '{folder1,folder2}', '**', '*.rb'), &method(:require))
explicación:
Dir.glob toma un bloque como argumento.
método (: requerir) will return the require method.
& método (: requerir) convertirá el método a un bloque.
Esto es un hermoso código. Me encanta cómo no hay bloques visibles. –
'Dir.glob (File.join (File.dirname (__ FILE__), '{lib, addons}', 'subfolder', '**', '*. rb '), & method (: require)) 'elimina la dependencia de la plataforma (como'/'o' \ '). Funciona bien. Gracias. –
En lugar de la concatenación de caminos como en algunas respuestas, yo uso File.expand_path
:
Dir[File.expand_path('importers/*.rb', File.dirname(__FILE__))].each do |file|
require file
end
Actualización:
En lugar de utilizar File.dirname
que podría hacer lo siguiente:
Dir[File.expand_path('../importers/*.rb', __FILE__)].each do |file|
require file
end
Dónde ..
quita el nombre de archivo de __FILE__
.
este parece ser definitivamente el camino a seguir, y lo más actualizado nswer, después de probar todo lo demás, +1 para 'File.expand_path' – SuckerForMayhem
Definitivamente prefiero esta respuesta a la aceptada. Varias respuestas 'Rails.root.join' también funcionan si estás en los rieles. – nzifnab
estoy unos años tarde a la fiesta, pero me gusta esta solución de una línea que utiliza para obtener los carriles para incluir todo en app/trabajadores/preocupaciones:
Dir[ Rails.root.join *%w(app workers concerns *) ].each{ |f| require f }
En rieles, que puede hacer:
Dir[Rails.root.join('lib', 'ext', '*.rb')].each { |file| require file }
actualización: se ha corregido con la sugerencia de @Jiggneshh Gohel para eliminar las barras.
Dado que 'Rails.root' es una instancia de [' Pathname'] (http://ruby-doc.org/stdlib/libdoc/path/rdoc/index.html), puede hacer esto en cualquier entorno de Ruby, no solo Rails (NB 'Rails.root.join ('lib/ext/*. Rb')' lee un poco mejor) – DMKE
Gracias por la recomendación; Edité para incluir tu comentario. – dankohn
Usando una barra inclinada (/) para subdirectorios en Rails.root, por ej. 'Rails.root.join ('/ lib')' no genera la ruta correcta. Encontré este para que funcione correctamente: 'Dir [Rails.root.join ('lib', 'ext', '* .rb')]. Cada {| archivo | requiere archivo} ' –
Y qué tal: require_relative *Dir['relative path']
?
Requerir relativo no toma varios archivos: http://ruby-doc.org/core-2.1.2/Kernel.html#method-i-require_relative – fabriciofreitag
OK, pero en mi ejemplo no lo es. El '*' cambia a 1. Funciona como llamada múltiple a require_relative. – Aleksander
_El '*' cambia a 1_ - ¿Qué quieres decir con eso? 'require_relative * Dir ['*. rb']' work, si solo hay un ruby-script. Pero si se encuentran varias secuencias de comandos de ruby, se obtiene 'require_relative ': número de argumentos incorrecto (4 para 1) (ArgumentError)' – knut
- 1. manera más limpia/de una sola línea para requerir todos los archivos en el directorio en Ruby?
- 2. Listar los archivos en un directorio y todos los subdirectorios
- 3. ¿Hay alguna manera más corta de requerir un archivo en el mismo directorio en ruby?
- 4. Liste de manera eficiente todos los subdirectorios en un directorio
- 5. mejor manera de conseguir los archivos de un directorio filtrada por cierta extensión en php
- 6. fuente de todos los archivos en un directorio de .bash_profile
- 7. ¿Eliminar todos los archivos de git de un directorio?
- 8. ¿Cómo recupero todos los nombres de archivos en un directorio?
- 9. ¿Es posible solicitar de forma recursiva todos los archivos en un directorio en Ruby?
- 10. Git - Seguimiento automático de todos los archivos en un directorio
- 11. ¿Cuál es la mejor manera de vaciar un directorio?
- 12. Obtener rutas absolutas de todos los archivos en un directorio
- 13. Ejecutar todos los archivos Python en un directorio
- 14. ¿Cómo incluir todos los archivos de un directorio con cmake?
- 15. Copie todos los archivos en el directorio
- 16. Ejecutar todos los archivos SQL en un directorio
- 17. Makefile: dependa de todos los archivos de un directorio
- 18. XQuery todos los archivos en un directorio específico?
- 19. Unir todos los archivos en un directorio, con un separador
- 20. QMake: compilando automáticamente todos los archivos en un directorio
- 21. ¿Cuál es la mejor manera de descargar todos los archivos WSDL expuestos por un servicio WCF?
- 22. gitignore todos los archivos de extensión en el directorio
- 23. mejor manera de requerir varios módulos en NodeJS
- 24. Script PHP para recorrer todos los archivos en un directorio?
- 25. Buscar todos los archivos CSV en un directorio usando Python
- 26. Eliminar todos los archivos en un directorio con Python
- 27. Mostrar todos los archivos de manera predeterminada
- 28. Cómo obtener archivos en un directorio, incluidos todos los subdirectorios
- 29. Listar todos los archivos y directorios en un directorio + subdirectorios
- 30. gmake compila todos los archivos en un directorio
Puede crear un archivo con el mismo nombre del directorio y hacer que requiera todos los archivos. RSpec hace esto. – pedromanoel