2010-12-01 5 views
48

Est-ce que require File.expand_path(..., __FILE__) est le meilleur moyen d'exiger d'autres fichiers dans un projet?Est-ce que FileExpand_path (..., __FILE__) est la meilleure pratique?

+0

Je le ferais si je le pouvais. C'est quelque chose que j'aimerais pouvoir faire sans. –

+0

Copie possible de http://stackoverflow.com/questions/224379/what-does-file-mean-in-ruby –

+0

duplication possible de [Ruby: require vs require \ _relative - meilleure pratique pour contourner le problème Ruby <1.9.2 and > = 1.9.2] (http://stackoverflow.com/questions/4333286/ruby-require-vs-require-relative-best-practice-to-workaround-running-in-both) –

Répondre

35

En Ruby 1.9.2 + require_relative est probablement le moyen le plus correct de le faire.

require a été modifié pour ne pas inclure votre répertoire '.' pour des raisons de sécurité. require_relative a été ajouté pour fournir une solution de fichier local pour les modules par rapport au chemin d'accès du script appelant.

Vous pouvez search here on StackOverflow, en particulier dans "What is require_relative in Ruby?", et les internets et trouver des astuces d'utilisation et le why-for messages expliquant comment il est né.

+2

Aussi, "[Ruby: require vs require_relative - meilleure pratique pour contourner le problème en cours d'exécution dans les deux Ruby <1.9.2 and > = 1.9.2] (http://stackoverflow.com/questions/4333286/ruby-require-vs-require-relative-best-practice-to-workaround-running-in -both) "est un excellent fil à expliquer. –

3

Sauf si vous modifiez $LOAD_PATH, ce qui serait une bonne idée si vous continuez à charger à partir de la même structure de répertoires, vous êtes bloqué de cette façon.

La façon dont je l'ai pris à le faire, pour assurer que les choses sont aussi multiplateformes que possible, est la suivante:

require File.expand_path(File.join(*%w[ ... ]), File.dirname(__FILE__)) 

Il est un peu bavard, mais il en résulte le plus court chemin possible et la moins de syntaxe dans la plupart des cas.

Un exemple plus précis serait:

require File.expand_path(File.join(*%w[ .. lib example ]), File.dirname(__FILE__)) 

Vous pouvez combiner cela avec une modification de $LOAD_PATH pour simplifier les choses si vous chargez beaucoup de fichiers et faire:

$LOAD_PATH << File.expand_path(File.join(*%w[ .. lib ]), File.dirname(__FILE__)) 

require 'example' 
2

Dans Ruby 1.8.x, où vous n'avez pas require_relative dans le noyau, File.expand_path(...,__FILE__) ne fonctionnera pas.

Supposons __FILE__ == "/home/yourname/foo.rb". File.expand_path("bar.rb",__FILE__) donne "/home/yourname/foo.rb/bar.rb.

Ce que vous voulez est File.expand_path("bar.rb",File.dirname(__FILE__)) qui retourne "/home/yourname/bar.rb"

Vous pouvez également obtenir require_relative du backports gem.

+0

vous pouvez toujours faire 'require File.expand_path (" ../ baz.rb ", __FILE __)' pour inclure baz.rb de foo.rb dans le même répertoire. –

+0

Après le commentaire de Matt, je vois que 'File.expand_path (" ../../lib/mongem.rb ", __FILE __)' est un exemple réel donné dans les docs 2.1.0 pour 'expand_path'.Mais cela implique de prétendre qu'un non-répertoire est un répertoire puis de passer à son parent supposé! Je suis déconcerté que les docs officiels recommandent une telle approche déviante, et je me demande si cela ne fonctionne que par un effet secondaire fragile de la mise en œuvre qui pourrait changer le comportement dans les futures versions. Je pense que l'approche 'dirname' est beaucoup plus propre. –

6

En Ruby 2.0, vous pouvez utiliser Kernel#__dir__

Questions connexes