Qual è la migliore pratica se voglio requireun 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_relativecomerequire, usarequire_relativeovunque dove è necessario in seguito - controlla se
require_relativeesiste 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
requirelavorare 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.rbe si voleva che l'interprete leggesse e analizzasse il contenuto del file b.rbnella 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).
backportssolo per require_relative, vedi la mia risposta ...
requireerequire_relative?