Les derniers ensembles de modifications de Ruby 1.9.2 ne font plus .
partie du répertoire actuel de votreLOAD_PATH
. J'ai un nombre non négligeable de fichiers Rakefiles qui supposent que cela .
fait partie du LOAD_PATH
, donc cela les a cassés (ils ont signalé "aucun fichier à charger" pour toutes les instructions exigent basées sur le chemin du projet). Y avait-il une justification particulière pour faire cela?
En ce qui concerne un correctif, l'ajout $: << "."
partout fonctionne, mais semble incroyablement piraté et je ne veux pas faire cela. Quelle est la meilleure façon de rendre mes fichiers Rakefiles 1.9.2+ compatibles?
require_relative
. Merci.require './filename'
ne fonctionne que si votre script est exécuté avec le répertoire de travail défini sur le même répertoire que celui où réside le script. Ce n'est souvent pas le cas dans les projets multi-répertoires.Il y a deux raisons:
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 actuel, lorsque votre code est exécuté. Ce qui signifie que, lorsque vous avez besoin d'un fichier et que vous dépendez de sa présence dans le répertoire actuel, vous n'avez aucun moyen de contrôler si ce fichier sera même présent ou s'il s'agit du fichier que vous attendez réellement d'y être.
la source
.
répertoire de travail courant. Si l'utilisateur se trouvecd
dans un répertoire différent, le répertoire de travail actuel change, et vous avez maintenant des fichiersrequire
complètement différents en fonction du répertoire dans lequel l'utilisateur se trouvait lorsqu'il a appelé votre script. Je ne pense pas que ce soit une bonne idée.$: << File.dirname(__FILE__)
lib
répertoire est sur le$LOAD_PATH
, puisrequire
tous les fichiers relatifs àlib
. En d'autres termes: je laisse à l'administrateur le soin de déterminer comment configurer le$LOAD_PATH
correctement. Si vous utilisez RubyGems, c'est trivial, car RubyGems le fait automatiquement pour vous, et si vous utilisez des paquets Debian, alors c'est le travail du responsable du paquet. Dans l'ensemble, cela semble très bien fonctionner..
de$LOAD_PATH
, Ruby 1.9.2 introduitrequire_relative
quelrequire
fichier ... surprise ... sa par rapport à l'emplacement du fichier en cours d'exécution (c'est-à-dire par rapport àFile.dirname(__FILE__)
).Comme d'autres réponses le soulignent, c'est un risque de sécurité car
.
dans votre chemin de chargement fait référence au répertoire de travail actuelDir.pwd
, pas au répertoire du fichier en cours de chargement. Ainsi, quiconque exécute votre script peut changer cela simplement encd
allant dans un autre répertoire. Pas bon!J'ai utilisé des chemins complets construits à partir
__FILE__
d'une alternative.Contrairement à
require_relative
, ceci est rétrocompatible avec Ruby 1.8.7.la source
require Pathname.new(__FILE__).dirname + 'filename'
Utilisation
require_relative 'file_to_require'
Ajoutez ceci dans votre code pour faire fonctionner require_relative dans la 1.8.7:
la source
'.' dans votre chemin 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 gens de Ruby ont été persuadés de la sagesse de ne pas faire cela.
la source
J'ai trouvé que c'était un changement déconcertant jusqu'à ce que je réalise quelques choses.
Vous pouvez définir RUBYLIB dans votre .profile (Unix) et continuer votre vie comme vous le faisiez auparavant:
export RUBYLIB="."
Mais comme mentionné ci-dessus, il a longtemps été considéré comme dangereux de le faire.
Dans la grande majorité des cas, vous pouvez éviter les problèmes en appelant simplement vos scripts Ruby avec un "." par exemple ./scripts/server.
la source
Comme Jörg W Mittag l'a souligné, je pense que ce que vous voulez utiliser, c'est
require_relative
que le fichier dont vous avez besoin est relatif au fichier source de larequire
déclaration et non au répertoire de travail actuel.Vos dépendances doivent être relatives à votre fichier de construction rake.
la source