Quelle est la meilleure pratique si je veux requireun 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_relativecommerequire, utiliserrequire_relativepartout où c'est nécessaire par la suite - vérifiez s'il
require_relativeexiste 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
requiretravailler 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.rbet que vous vouliez que l'interpréteur lise et analyse le contenu du fichier b.rbdans 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).
backportsjuste pour require_relative, voir ma réponse ...
requireetrequire_relative?