2011-07-12 13 views
51

estoy un poco confundido acerca de por qué mi proyecto no puede cargar los archivos que necesita, es una muy simple árbol del proyecto:rutas de carga Comprensión de Ruby

processor/ 
    bin/ 
    lib/ 
    processor.rb 
    processor/ 
     mapper.rb 
     reducer.rb 

y mi archivo processor.rb parece

require 'processor/mapper' 
require 'processor/reducer' 

class Processor 

end 

Y sólo para probar que ese archivo se ve como asignador:

class Mapper 
    def run 
    puts "running map" 
    end 
end 

Pero correr ruby lib/processor.rb resultados en:

<internal:lib/rubygems/custom_require>:29:in `require': no such file to load -- processor/mapper (LoadError) 
    from <internal:lib/rubygems/custom_require>:29:in `require' 
    from lib/processor.rb:3:in `<class:Processor>' 
    from lib/processor.rb:2:in `<main>'  
+1

"Ruby's" tiene un apóstrofo porque está indicando lo las rutas de anuncios pertenecen a ella, en lugar de eso hay múltiples rubíes. –

Respuesta

68

de $LOAD_PATH Ruby no necesita incluir el directorio lib por defecto (aunque ahí es donde se encuentra el archivo que está ejecutando).

Usted puede decirle al intérprete ruby incluirlo:

ruby -Ilib lib/processor.rb 

o puede agregar la carpeta lib a la trayectoria de carga:

$LOAD_PATH.unshift(File.dirname(__FILE__)) 
require 'processor/mapper' 
... 
33

Ruby 1.9 ya no incluye "." en la ruta de carga Haga require "#{File.dirname(__FILE__)}/processor/mapper" o use require_relative.

Siempre se puede determinar la ruta de carga actual mediante la inspección de $LOAD_PATH (o $:)

(editado: $ LOAD_PATH no $: LOAD_PATH)

+3

Su escenario exacto en realidad tampoco funcionaría en 1.8 (ejecutando 'ruby lib/processor.rb' de la carpeta raíz' processor'). Sin embargo, ejecutar 'ruby processor.rb' mientras está en la carpeta' lib' funcionaría en 1.8, pero no en 1.9. –

4

Uso de Ruby require_relative en este caso:

require_relative "processor/mapper" 
Cuestiones relacionadas