Quelle est la meilleure pratique si je veux require
un fichier relatif dans Ruby et que je veux qu'il fonctionne à la fois dans 1.8.x et> = 1.9.2?
Je vois quelques options:
- fais
$LOAD_PATH << '.'
et oublie tout - faire
$LOAD_PATH << File.dirname(__FILE__)
require './path/to/file'
- vérifier si
RUBY_VERSION
<1.9.2, puis définirrequire_relative
commerequire
, utiliserrequire_relative
partout où c'est nécessaire par la suite - vérifiez s'il
require_relative
existe déjà, si c'est le cas, essayez de procéder comme dans le cas précédent - utilisez des constructions étranges telles que - hélas, elles ne semblent pas fonctionner complètement dans Ruby 1.9, car, par exemple:
require File.join(File.dirname(__FILE__), 'path/to/file')
$ cat caller.rb require File.join(File.dirname(__FILE__), 'path/to/file') $ cat path/to/file.rb puts 'Some testing' $ ruby caller Some testing $ pwd /tmp $ ruby /tmp/caller Some testing $ ruby tmp/caller tmp/caller.rb:1:in 'require': no such file to load -- tmp/path/to/file (LoadError) from tmp/caller.rb:1:in '<main>'
- Construction encore plus étrange: semble fonctionner, mais c'est étrange et pas très beau.
require File.join(File.expand_path(File.dirname(__FILE__)), 'path/to/file')
- Utilisez la gemme de backports - c'est un peu lourd, cela nécessite une infrastructure rubygems et inclut des tonnes d'autres solutions de contournement, alors que je veux juste
require
travailler avec des fichiers relatifs.
Il y a une question étroitement liée chez StackOverflow qui donne quelques exemples supplémentaires, mais elle ne donne pas de réponse claire - ce qui est une meilleure pratique.
Existe-t-il une solution universelle décente et acceptée par tous pour faire fonctionner mon application à la fois sur Ruby <1.9.2 et> = 1.9.2?
METTRE À JOUR
Clarification: je ne veux pas seulement des réponses comme "vous pouvez faire X" - en fait, j'ai déjà mentionné la plupart des choix en question. Je veux une justification , c'est-à-dire pourquoi c'est une meilleure pratique, quels sont ses avantages et ses inconvénients et pourquoi elle devrait être choisie parmi les autres.
a.rb
et que vous vouliez que l'interpréteur lise et analyse le contenu du fichier b.rb
dans le répertoire actuel (généralement le même répertoire qu'avec a.rb
), vous écrivez simplement require 'b'
et ce serait bien car le chemin de recherche par défaut incluait le répertoire actuel. Dans Ruby 1.9 plus moderne, vous devrez écrire require_relative 'b'
dans ce cas, comme le require 'b'
ferait une recherche uniquement dans les chemins de bibliothèque standard. C'est ce qui rompt la compatibilité ascendante et descendante pour les scripts plus simples qui ne seront pas installés correctement (par exemple, installer les scripts eux-mêmes).
backports
juste pour require_relative
, voir ma réponse ...
require
etrequire_relative
?