¿Cuál es la mejor práctica si quiero requireun 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_relativecomorequire, use enrequire_relativetodas partes donde sea necesario después - compruebe si
require_relativeya 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
requiretrabajar 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.rby deseaba que el intérprete leyera y analizara el contenido del archivo b.rben 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).
backportssolo para require_relative, vea mi respuesta ...
requireyrequire_relative?