2010-08-29 8 views
12

Tengo un código Ruby con diferentes clases en algunos archivos. En un archivo, comienzo la ejecución. Este archivo require s mis otros archivos.Ruby require path

  • ¿Es esta una buena manera de iniciar un código de rubí?
  • Cuando ejecuto el código desde un enlace simbólico, por ejemplo DIR2/MyRubyCode es un enlace al archivo principal DIR1/MyRubyCode.rb, entonces mis requerimientos fallarán. Resolví el problema agregando la ruta DIR1 a $LOAD_PATH antes del require, pero creo que habría formas mucho mejores de hacerlo. ¿Tienes alguna sugerencia al respecto?

Respuesta

16

Si desea comprobar si un archivo está siendo Rubí 'require 'ed o ejecutado con' ruby MyRubyCode.rb', comprobar la constante __FILE__.

# If the first argument to `ruby` is this file. 
if $0 == __FILE__ 
    # Execute some stuff. 
end 

En cuanto al problema require/$ LOAD_PATH, siempre puede usar la ruta relativa en la instrucción require. Por ejemplo:

# MyRubyCode.rb 
require "#{File.dirname(__FILE__)}/foo_class" 
require "#{File.dirname(__FILE__)}/bar_module" 

que incluiría la foo_class.rb y bar_module.rb archivos en el mismo directorio que MyRubyCode.rb.

+1

Gracias pero si requiero con File.dirname (__ FILE__), cuando lance el código usando un alias, también intenta incluir desde '.' y todavía tengo el error 'no hay ese archivo para cargar'. –

+1

Eso es correcto. Tendría que obtener el objetivo del enlace simbólico (que iría en lugar de 'File.dirname()'). Echa un vistazo a esta publicación para ver un par de formas diferentes de hacerlo: http://stackoverflow.com/questions/1237939/ruby-how-do-i-get-the-target-of-a-symlink –

+2

Gracias. Funciona bien con '$ LOAD_PATH << File.dirname (Pathname.new (File.expand_path (__ FILE __)). Realpath.to_s) .to_s'. –

6

Sé que esto es una cuestión de edad, pero no hay una respuesta actualizada a ella, y quería publicarlo:

partir de una versión más reciente de Rubí (no estoy seguro de cuándo), se puede requerir archivos en el mismo directorio utilizando la siguiente:

require './foo_class' 
require './bar_module' 

y va a cargar archivos llamados foo_class.rb y bar_module.rb en el mismo directorio.

Para comprobar si su archivo está siendo require d o se ejecutó normalmente, marque la otra respuesta.

+2

Esta respuesta no aborda el caso de uso en la pregunta original, porque aún fallará si el archivo ruby ​​se está invocando desde un enlace simbólico o está en la ruta del usuario. – Nathan

17

Si está utilizando Ruby 1.9 o superior, el usuario require_relative para sus dependencias.

require_relative 'foo_class' 
require_relative 'bar_module'