Est - require File.expand_path(..., __FILE__)
le meilleur moyen d'obliger les autres fichiers à l'intérieur d'un projet?
Réponses
Trop de publicités?En Ruby 1.9.2 + require_relative
est probablement le plus façon correcte de le faire.
require
a été modifié afin de ne pas inclure votre '.'
répertoire pour des raisons de sécurité. require_relative
a été ajoutée pour fournir un local de fichier de solution pour les modules relatifs à votre script d'appel du chemin.
Vous pouvez rechercher ici sur StackOverflow, en particulier dans "qu'est-Ce que require_relative en Ruby?", et les internets et de trouver des astuces d'utilisation et le pourquoi des messages expliquant comment il est venu sur.
Sauf si vous modifiez $LOAD_PATH
, ce qui serait une bonne idée si vous gardez le chargement à partir de la même structure de répertoire, vous êtes coincé, faire de cette façon.
Le chemin que j'ai pris à le faire, pour vous assurer que les choses sont comme de la croix-plate-forme que possible, c'est ceci:
require File.expand_path(File.join(*%w[ ... ]), File.dirname(__FILE__))
C'est un peu verbeux, mais elle se traduit dans le plus court chemin possible et le moins de syntaxe peluches dans la plupart des cas.
Un exemple plus spécifique 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 êtes en train de charger un lot de fichiers et de faire cela:
$LOAD_PATH << File.expand_path(File.join(*%w[ .. lib ]), File.dirname(__FILE__))
require 'example'
En Ruby 1.8.x, où vous n'avez pas require_relative
dans le coeur, File.expand_path(...,__FILE__)
ne fonctionne 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 renvoie "/home/yourname/bar.rb"
Vous pouvez également obtenir de l' require_relative
de la backports gem.