2010-12-01 7 views
48

¿Es require File.expand_path(..., __FILE__) la mejor manera de requerir otros archivos dentro de un proyecto?¿Se requiere File.expand_path (..., __FILE__) la mejor práctica?

+0

me había 100 esto si pudiera. Es algo de lo que me gustaría prescindir. –

+0

Posible duplicado de http://stackoverflow.com/questions/224379/what-does-file-mean-in-ruby –

+0

posible duplicado de [Ruby: require vs require \ _relative - práctica recomendada para la solución en Ruby <1.9.2 and > = 1.9.2] (http://stackoverflow.com/questions/4333286/ruby-require-vs-require-relative-best-practice-to-workaround-running-in-both) –

Respuesta

35

En Ruby 1.9.2 + require_relative es probablemente la forma más correcta de hacerlo.

require se ha cambiado para no incluir el directorio '.' por razones de seguridad. Se agregó require_relative para proporcionar una solución de archivo local para los módulos relativos a la ruta del script de llamada.

Puede search here on StackOverflow, particularmente en "What is require_relative in Ruby?", y en los internets y encontrar trucos de uso y why-for messages explicando cómo se produjo.

+2

Además, "[Ruby: require vs require_relative: la mejor práctica para ejecutar una solución en Ruby <1.9.2 and > = 1.9.2] (http://stackoverflow.com/questions/4333286/ruby-require-vs-require-relative-best-practice-to-workaround-running-in -ambos) "es un gran hilo que explica esto. –

3

A menos que modifique $LOAD_PATH, lo que sería una buena idea si continúa cargando desde la misma estructura de directorios, está trabada haciéndolo de esa manera.

La forma en que he tomado a hacerlo, para asegurar que las cosas son tan multiplataforma como sea posible, es la siguiente:

require File.expand_path(File.join(*%w[ ... ]), File.dirname(__FILE__)) 

Es un poco prolijo, pero el resultado es el camino y el más corto posible menos cantidad de sintaxis en la mayoría de los casos.

Un ejemplo más específico sería:

require File.expand_path(File.join(*%w[ .. lib example ]), File.dirname(__FILE__)) 

Esto se puede combinar con una modificación a $LOAD_PATH para simplificar las cosas si va a cargar una gran cantidad de archivos y hacer esto:

$LOAD_PATH << File.expand_path(File.join(*%w[ .. lib ]), File.dirname(__FILE__)) 

require 'example' 
2

En Ruby 1.8.x, donde no tiene require_relative en el núcleo, File.expand_path(...,__FILE__) no funcionará.

Suponer __FILE__ == "/home/yourname/foo.rb". File.expand_path("bar.rb",__FILE__) da "/home/yourname/foo.rb/bar.rb.

Lo que queremos es que devuelve File.expand_path("bar.rb",File.dirname(__FILE__))"/home/yourname/bar.rb"

Además, puede pedir require_relative del backports gem.

+0

siempre puede hacer 'require File.expand_path (" ../ baz.rb ", __FILE __)' para incluir baz.rb desde foo.rb en el mismo directorio. –

+0

Siguiendo con el comentario de Matt, veo que 'File.expand_path (" ../../ lib/mygem.rb ", __FILE __)' es un ejemplo real dado en los documentos 2.1.0 para 'expand_path'.¡Pero eso implica pretender que un no-directorio es un directorio y luego pasar a su supuesto padre! Estoy desconcertado de que los documentos oficiales recomendarían un enfoque tan desviado, y me pregunto si solo funciona a través de algún efecto secundario frágil de la implementación que podría cambiar el comportamiento en futuras versiones. Creo que el enfoque 'dirname' es mucho más limpio. –

6

en Ruby 2.0 se puede utilizar Kernel#__dir__