Qual é a melhor prática se eu quiser require
um arquivo relativo no Ruby e trabalhar com o 1.8.xe> = 1.9.2?
Vejo algumas opções:
- basta fazer
$LOAD_PATH << '.'
e esquecer tudo - Faz
$LOAD_PATH << File.dirname(__FILE__)
require './path/to/file'
- verifique se
RUBY_VERSION
<1.9.2 e definarequire_relative
comorequire
, use emrequire_relative
qualquer lugar onde for necessário posteriormente - verifique se
require_relative
já existe, se existir, tente continuar como no caso anterior - use construções estranhas como - infelizmente elas não parecem funcionar completamente no Ruby 1.9, porque, por exemplo:
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>'
- Construção ainda mais estranha: parece funcionar, mas é estranha e não é muito bonita.
require File.join(File.expand_path(File.dirname(__FILE__)), 'path/to/file')
- Use a gem de backports - é meio pesada, requer infraestrutura de rubygems e inclui várias outras soluções alternativas, enquanto eu só quero
require
trabalhar com arquivos relativos.
Há uma pergunta intimamente relacionada no StackOverflow que fornece mais alguns exemplos, mas não fornece uma resposta clara - o que é uma prática recomendada.
Existe alguma solução universal decente e aceita por todos para fazer meu aplicativo rodar em Ruby <1.9.2 e> = 1.9.2?
ATUALIZAR
Esclarecimento: não quero apenas respostas como "você pode fazer X" - na verdade, eu já mencionei a maioria das opções em questão. Quero justificativa , ou seja, por que é uma prática recomendada, quais são seus prós e contras e por que deve ser escolhida entre as outras.
a.rb
e desejava fazer o interpretador ler e analisar o conteúdo do arquivo b.rb
no diretório atual (geralmente o mesmo diretório que o anterior a.rb
), basta escrever require 'b'
e seria bom, pois o caminho de pesquisa padrão incluía o diretório atual. No Ruby 1.9 mais moderno, você terá que escrever require_relative 'b'
neste caso, pois require 'b'
somente pesquisaria nos caminhos padrão da biblioteca. É isso que interrompe a compatibilidade com versões anteriores e posteriores de scripts mais simples que não serão instalados corretamente (por exemplo, eles próprios instalam scripts).
backports
apenas para require_relative
, veja a minha resposta ...
require
erequire_relative
?