154 votes

Pourquoi Ruby 1.9.2 supprime-t-il "." de LOAD_PATH, et quelle est l'alternative ?

Les dernières modifications apportées à Ruby 1.9.2 ne rendent plus le répertoire courant . partie de votre LOAD_PATH . J'ai un nombre non trivial de Rakefiles qui supposent que . fait partie de la LOAD_PATH et cela les a cassés (ils ont signalé "aucun fichier à charger" pour toutes les instructions "require" basées sur le chemin du projet). Y avait-il une justification particulière pour faire cela ?

En ce qui concerne la solution, l'ajout de $: << "." Partout, cela fonctionne, mais cela semble incroyablement compliqué et je ne veux pas le faire. Quel est le meilleur moyen de rendre mes Rakefiles 1.9.2+ compatibles ?

140voto

rogerdpack Points 12806

Il a été considéré comme un risque de "sécurité".

Vous pouvez contourner ce problème en utilisant des chemins absolus

File.expand_path(__FILE__) et al

ou de faire

require './filename' (ironically).

ou en utilisant

require_relative 'filename'

ou l'ajout d'un répertoire "include

ruby -I . ...

ou la même chose, en utilisant l'irb ;

$irb -I .

34voto

Jörg W Mittag Points 153275

Il y a deux raisons à cela :

  • robustesse et
  • sécurité

Les deux sont basés sur le même principe sous-jacent : en général, vous ne pouvez tout simplement pas savoir quel est le répertoire courant lorsque votre code est exécuté. Cela signifie que, lorsque vous avez besoin d'un fichier et que vous dépendez de sa présence dans le répertoire courant, vous n'avez aucun moyen de contrôler si ce fichier s'y trouve ou s'il s'agit du fichier que vous vous attendez à y trouver.

16voto

Jonathan Tran Points 7058

Comme le soulignent d'autres réponses, il s'agit d'un risque pour la sécurité car . dans votre chemin de chargement se réfère au répertoire de travail actuel Dir.pwd et non le répertoire du fichier en cours de chargement. Ainsi, la personne qui exécute votre script peut changer cela simplement en cd vers un autre répertoire. Ce n'est pas bon !

J'ai utilisé des chemins complets construits à partir de __FILE__ comme alternative.

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

Contrairement à require_relative Cette version est rétrocompatible avec Ruby 1.8.7.

8voto

Tyler Brock Points 9769

Utilice require_relative 'file_to_require'

Ajoutez ceci dans votre code pour que require_relative fonctionne dans la version 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

6voto

Rodger Points 254

'.' dans votre chemin d'accès a longtemps été considéré comme une mauvaise chose dans le monde Unix (voir, par exemple, http://www.faqs.org/faqs/unix-faq/faq/part2/section-13.html ). Je suppose que les responsables de Ruby ont été persuadés de la sagesse de ne pas faire cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X