Los últimos conjuntos de cambios a Ruby 1.9.2 ya no hacen que el directorio actual sea .
parte de su LOAD_PATH
. Tengo un número no trivial de Rakefiles que asumen que .
es parte del LOAD_PATH
, por lo que esto los rompió (informaron que "no se debe cargar ese archivo" para todas las declaraciones de requerimiento basadas en la ruta del proyecto). ¿Hubo una justificación particular para hacer esto?
En cuanto a una solución, agregar en $: << "."
todas partes funciona, pero parece increíblemente hacky y no quiero hacer eso. ¿Cuál es la forma preferida de hacer que mis Rakefiles 1.9.2+ sean compatibles?
require_relative
. Gracias.require './filename'
solo funciona si su script se ejecuta con el directorio de trabajo establecido en el mismo directorio en el que reside el script. Este no suele ser el caso en proyectos de directorios múltiples.Hay dos razones:
Ambos se basan en el mismo principio subyacente: en general, simplemente no puede saber cuál es el directorio actual, cuando se ejecuta su código. Lo que significa que, cuando necesita un archivo y depende de que esté en el directorio actual, no tiene forma de controlar si ese archivo estará allí, o si es el archivo que realmente espera que esté allí.
fuente
.
, es decir, el directorio de trabajo actual. Si el usuariocd
está en un directorio diferente, el directorio de trabajo actual cambia, y ahora los archivos sonrequire
completamente diferentes dependiendo de en qué directorio se encontraba el usuario cuando llamó a su script. No creo que sea una buena idea.$: << File.dirname(__FILE__)
lib
directorio está en$LOAD_PATH
y luegorequire
todos los archivos relativos alib
. En otras palabras: le dejo al administrador que descubra cómo configurarlo$LOAD_PATH
correctamente. Si usa RubyGems, eso es trivial, porque RubyGems lo hace automáticamente por usted, y si usa paquetes Debian, entonces es el trabajo del mantenedor de paquetes. En general, parece funcionar bastante bien..
de$LOAD_PATH
, Ruby 1.9.2 introducerequire_relative
la que ... sorpresa ...require
sa archivo relativa a la ubicación del archivo que se está ejecutando (es decir, en relación conFile.dirname(__FILE__)
).Como otras respuestas señalan, es un riesgo de seguridad porque
.
en su ruta de carga se refiere al directorio de trabajo actualDir.pwd
, no al directorio del archivo actual que se está cargando. Entonces, quien ejecute su script puede cambiar esto simplementecd
yendo a otro directorio. ¡No está bien!He estado usando caminos completos construidos
__FILE__
como una alternativa.A diferencia
require_relative
, esto es retrocompatible con Ruby 1.8.7.fuente
require Pathname.new(__FILE__).dirname + 'filename'
Utilizar
require_relative 'file_to_require'
Agregue esto en su código para hacer que require_relative funcione en 1.8.7:
fuente
'.' en su camino ha sido considerado una cosa mala en el mundo de Unix (ver, por ejemplo, http://www.faqs.org/faqs/unix-faq/faq/part2/section-13.html ). Asumo que la gente de Ruby ha sido persuadida de la sabiduría de no hacer eso.
fuente
Encontré que esto era un cambio confuso hasta que me di cuenta de un par de cosas.
Puede configurar RUBYLIB en su .profile (Unix) y continuar con la vida como lo hizo antes:
export RUBYLIB="."
Pero como se mencionó anteriormente, durante mucho tiempo se ha considerado inseguro hacerlo.
Para la gran mayoría de los casos, puede evitar problemas simplemente llamando a sus scripts de Ruby con un '.' por ejemplo ./scripts/server.
fuente
Como Jörg W Mittag señaló, creo que lo que quiere usar es
require_relative
que el archivo que necesita es relativo al archivo fuente de larequire
declaración y no al directorio de trabajo actual.Sus dependencias deben ser relativas a su archivo de compilación de rastrillo.
fuente