ruby rake require load-path

¿Por qué Ruby 1.9.2 elimina "." De LOAD_PATH, y cuál es la alternativa?



rake require (7)

''''. en su camino ha sido considerado como algo malo en el mundo de Unix (ver, por ejemplo, http://www.faqs.org/faqs/unix-faq/faq/part2/section-13.html ). Supongo que la gente de Ruby ha sido persuadida de la sabiduría de no hacer eso.

Los últimos conjuntos de cambios a Ruby 1.9.2 ya no forman el directorio actual . parte de tu LOAD_PATH . Tengo una cantidad no trivial de Rakefiles que asumen eso . es parte de LOAD_PATH , por lo que esto los rompió (informaron que "no se carga ese archivo" para todas las sentencias requeridas que se basan en la ruta del proyecto). ¿Hubo una justificación particular para hacer esto?

En cuanto a una solución, agregando $: << "." en todas partes funciona, pero parece increíblemente hacky y no quiero hacer eso. ¿Cuál es la forma preferida de hacer que mi Rakefiles 1.9.2+ sea compatible?


Como señaló Jörg W Mittag, creo que lo que quiere utilizar es require_relative por lo que el archivo que necesita es relativo al archivo fuente de la declaración require y no al actual directorio de trabajo.

Sus dependencias deben ser relativas a su archivo de generación de rake.


Como señalan otras respuestas, es un riesgo de seguridad porque . en su ruta de carga se refiere al presente directorio de trabajo Dir.pwd , no al directorio del archivo actual que se está cargando. Entonces, quien ejecuta su script puede cambiar esto simplemente al cd a otro directorio. ¡No está bien!

He estado usando rutas completas construidas a partir de __FILE__ como alternativa.

require File.expand_path(File.join(File.dirname(__FILE__), ''filename''))

A diferencia de require_relative , esto es retrocompatible con Ruby 1.8.7.


Descubrí que se trataba de un cambio confuso hasta que me di cuenta de un par de cosas.

Puede configurar RUBYLIB en su .profile (Unix) y seguir con la vida como lo hacía antes:

export RUBYLIB="."

Pero como se mencionó anteriormente, desde hace tiempo se considera inseguro hacerlo.

En la gran mayoría de los casos, puede evitar problemas simplemente llamando a sus scripts de Ruby con un '''' anterior ''''. por ejemplo, /scripts/server.


Hay dos razones:

  • solidez y
  • seguridad

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í.


Se consideró un riesgo de "seguridad".

Puedes evitarlo usando rutas absolutas

File.expand_path(__FILE__) et al

o haciendo

require ''./filename'' (ironically).

o usando

require_relative ''filename''

o agregando un directorio "incluir"

ruby -I . ...

o lo mismo, usando irb;

$irb -I .


Use require_relative ''file_to_require''

Tíralo en tu código para que require_relative funcione en 1.8.7:

unless Kernel.respond_to?(:require_relative) module Kernel def require_relative(path) require File.join(File.dirname(caller.first), path.to_str) end end end