49 votes

Est besoin de Fichier.expand_path(..., __FILE__) la meilleure pratique?

Est - require File.expand_path(..., __FILE__) le meilleur moyen d'obliger les autres fichiers à l'intérieur d'un projet?

37voto

the Tin Man Points 69148

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.

7voto

Steve Benner Points 540

En Ruby 2.0, vous pouvez utiliser Kernel#__dir__

3voto

tadman Points 70178

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'

2voto

Ken Bloom Points 27197

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.

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