¿Cuál es la mejor práctica si quiero require
un archivo relativo en Ruby y quiero que funcione tanto en 1.8.xy> = 1.9.2?
Veo algunas opciones:
- solo hazlo
$LOAD_PATH << '.'
y olvídalo todo - hacer
$LOAD_PATH << File.dirname(__FILE__)
require './path/to/file'
- verifique si
RUBY_VERSION
<1.9.2, luego definarequire_relative
comorequire
, use enrequire_relative
todas partes donde sea necesario después - compruebe si
require_relative
ya existe, si es así, intente continuar como en el caso anterior - use construcciones extrañas como , por desgracia, no parecen funcionar completamente en Ruby 1.9 porque, por ejemplo:
require File.join(File.dirname(__FILE__), 'path/to/file')
$ cat caller.rb require File.join(File.dirname(__FILE__), 'path/to/file') $ cat path/to/file.rb puts 'Some testing' $ ruby caller Some testing $ pwd /tmp $ ruby /tmp/caller Some testing $ ruby tmp/caller tmp/caller.rb:1:in 'require': no such file to load -- tmp/path/to/file (LoadError) from tmp/caller.rb:1:in '<main>'
- Construcción aún más extraña: parece funcionar, pero es raro y no del todo bien parecido.
require File.join(File.expand_path(File.dirname(__FILE__)), 'path/to/file')
- Use gemas de backports : es un poco pesado, requiere infraestructura de rubygems e incluye toneladas de otras soluciones, mientras que solo quiero
require
trabajar con archivos relativos.
Hay una pregunta estrechamente relacionada en StackOverflow que da algunos ejemplos más, pero no da una respuesta clara, que es una práctica recomendada.
¿Existe alguna solución universal aceptable y aceptada por todos para hacer que mi aplicación se ejecute en Ruby <1.9.2 y> = 1.9.2?
ACTUALIZAR
Aclaración: no quiero solo respuestas como "puedes hacer X"; de hecho, ya he mencionado la mayoría de las opciones en cuestión. Quiero justificación , es decir, por qué es una mejor práctica, cuáles son sus pros y sus contras y por qué debería elegirse entre los demás.
a.rb
y deseaba que el intérprete leyera y analizara el contenido del archivo b.rb
en el directorio actual (generalmente el mismo directorio que con a.rb
), simplemente escribiría require 'b'
y estaría bien, ya que la ruta de búsqueda predeterminada incluía el directorio actual. En Ruby 1.9 más moderno, tendrá que escribir require_relative 'b'
en este caso, ya require 'b'
que solo buscaría en rutas de biblioteca estándar. Eso es lo que rompe la compatibilidad hacia adelante y hacia atrás para secuencias de comandos más simples que no se instalarán correctamente (por ejemplo, instalen las secuencias de comandos ellos mismos).
backports
solo para require_relative
, vea mi respuesta ...
require
yrequire_relative
?