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

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?

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 . 

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

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.

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 

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

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.

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 statement require y no al actual directorio de trabajo.

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