mixin - ruby import class from another file
¿La forma más sencilla y sencilla de requerir todos los archivos en el directorio en Ruby? (4)
Al crear gemas, a menudo tengo una estructura de directorios como esta:
|--lib
|-- helpers.rb
`-- helpers
|-- helper_a.rb
`-- helper_b.rb
Dentro de helpers.rb
, solo necesito 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 esa única línea para que nunca tenga que agregarla? Acabo de llegar a esto muy rápido:
dir = File.join(File.dirname(__FILE__), "helpers")
Dir.entries(dir)[2..-1].each { |file| require "#{dir}/#{file[0..-4]}" }
Pero son dos líneas y feo. ¿Qué trucos hábiles has hecho para hacer de esto una sola línea?
Hola, la forma más limpia que he descubierto es usar Dir.glob con comodines.
Ponga lo siguiente en su archivo de rake:
gem.files = Dir.glob(''lib/**/ *.rb'')
Debería funcionar una golosina.
Me gusta require_relative:
Dir.glob(''lib/**/*.rb'') { |f| require_relative f }
El truco `& method (: require_relative) no funcionará con require_relative. Yo obtengo:
`require_relative'': cannot infer basepath (LoadError)
Pero sí guarda la molestia de la computación project_root
Estoy usando ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.5.0]
# helpers.rb
Dir[__dir__ + ''/helpers/*''].each &method(:require)
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))