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?
Répondre
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é.
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. –
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'
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.
vous pouvez toujours faire 'require File.expand_path (" ../ baz.rb ", __FILE __)' pour inclure baz.rb de foo.rb dans le même répertoire. –
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. –
En Ruby 2.0, vous pouvez utiliser Kernel#__dir__
- 1. Que signifie __FILE__?
- 2. Que signifie __FILE__ dans Ruby?
- 3. Est-ce que la sous-vue codée en dur est trop fragile ou la meilleure pratique?
- 4. Que signifie "?" faire? Qu'est-ce que __FILE__?
- 5. Webapp meilleure pratique template_dict
- 6. Qu'est-ce que la meilleure pratique .htaccess RewriteRule?
- 7. Xcode Gestion de fichiers. Quelle est la meilleure pratique?
- 8. Quelle est la meilleure pratique pour écrire du XHTML?
- 9. quelle est la meilleure pratique de Java pour gérer les
- 10. Quelle est la meilleure pratique pour écrire des bookmarklets?
- 11. Quelle est la meilleure pratique de génération de composants MSI?
- 12. Dojo Layers meilleure pratique
- 13. Méthodes getClass() et statiques: Quelle est la meilleure pratique?
- 14. Quelle est la meilleure pratique pour modifier les états d'affichage?
- 15. Classes d'organisation - Meilleure pratique?
- 16. cmake meilleure pratique
- 17. Single SignOn - Meilleure pratique
- 18. SQL Select Meilleure pratique
- 19. Quelle est la meilleure pratique pour une branche git qui nécessite que maître soit constamment fusionné?
- 20. MVC question de la meilleure pratique
- 21. Objective-C @class/importer la meilleure pratique
- 22. StructureMap, LinqToSql, test de la meilleure pratique
- 23. Meilleure pratique pour la sortie PHP
- 24. condition dans la récursivité - meilleure pratique
- 25. printemps mvc @requestmapping meilleure pratique
- 26. Meilleure pratique pour Java IPC
- 27. Meilleure pratique: Scripts intersites légitimes
- 28. Meilleure pratique des délégués d'application
- 29. Meilleure pratique pour l'envoi ItemsSource
- 30. release Vs nil - Meilleure pratique
Je le ferais si je le pouvais. C'est quelque chose que j'aimerais pouvoir faire sans. –
Copie possible de http://stackoverflow.com/questions/224379/what-does-file-mean-in-ruby –
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) –