Qual è la migliore pratica se voglio require
un file relativo in Ruby e voglio che funzioni sia in 1.8.xe> = 1.9.2?
Vedo alcune opzioni:
- fai
$LOAD_PATH << '.'
e dimentica tutto - fare
$LOAD_PATH << File.dirname(__FILE__)
require './path/to/file'
- controlla se
RUBY_VERSION
<1.9.2, quindi definiscirequire_relative
comerequire
, usarequire_relative
ovunque dove è necessario in seguito - controlla se
require_relative
esiste già, in caso affermativo, prova a procedere come nel caso precedente - usa strane costruzioni come - ahimè non sembrano funzionare a fondo in Ruby 1.9, perché, ad esempio:
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>'
- Costruzione ancora più strana: sembra funzionare, ma è strana e non abbastanza bella.
require File.join(File.expand_path(File.dirname(__FILE__)), 'path/to/file')
- Usa la gemma dei backport : è un po 'pesante, richiede un'infrastruttura rubygems e include tonnellate di altre soluzioni alternative, mentre voglio solo
require
lavorare con i file relativi.
StackOverflow ha una domanda strettamente correlata che fornisce alcuni altri esempi, ma non fornisce una risposta chiara, che è una buona pratica.
Esiste una soluzione universale accettabile da parte di tutti per far funzionare la mia applicazione su Ruby <1.9.2 e> = 1.9.2?
AGGIORNARE
Chiarimento: non voglio solo risposte come "puoi fare X" - in effetti, ho già menzionato la maggior parte delle scelte in questione. Voglio una motivazione , ovvero perché è una buona pratica, quali sono i suoi pro e contro e perché dovrebbe essere scelta tra le altre.
a.rb
e si voleva che l'interprete leggesse e analizzasse il contenuto del file b.rb
nella directory corrente (di solito la stessa directory con a.rb
), si scriverebbe require 'b'
e andrebbe bene come percorso di ricerca predefinito incluso directory corrente. In Ruby 1.9 più moderno, dovrai scrivere require_relative 'b'
in questo caso, come cercherebbe require 'b'
solo nei percorsi di libreria standard. Questa è la cosa che interrompe la compatibilità avanti e indietro per gli script più semplici che non verranno installati correttamente (ad esempio, gli script di installazione stessi).
backports
solo per require_relative
, vedi la mia risposta ...
require
erequire_relative
?