Apa praktik terbaik jika saya ingin require
file relatif di Ruby dan saya ingin itu berfungsi di 1.8.x dan> = 1.9.2?
Saya melihat beberapa opsi:
- lakukan saja
$LOAD_PATH << '.'
dan lupakan semuanya - melakukan
$LOAD_PATH << File.dirname(__FILE__)
require './path/to/file'
- periksa apakah
RUBY_VERSION
<1.9.2, lalu definisikanrequire_relative
sebagairequire
, gunakan direquire_relative
mana-mana yang diperlukan setelahnya - periksa apakah
require_relative
sudah ada, jika sudah, coba untuk melanjutkan seperti pada kasus sebelumnya - gunakan konstruksi aneh seperti - sayangnya mereka sepertinya tidak bekerja di Ruby 1.9 secara menyeluruh, karena, misalnya:
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>'
- Bahkan konstruksi yang lebih aneh: tampaknya berfungsi, tetapi aneh dan tidak cukup tampan.
require File.join(File.expand_path(File.dirname(__FILE__)), 'path/to/file')
- Gunakan backports gem - ini agak berat, membutuhkan infrastruktur rubygem dan memasukkan banyak solusi lain, sementara saya hanya ingin
require
bekerja dengan file relatif.
Ada pertanyaan terkait erat di StackOverflow yang memberikan beberapa contoh lagi, tetapi itu tidak memberikan jawaban yang jelas - yang merupakan praktik terbaik.
Apakah ada solusi universal yang layak dan diterima oleh semua orang untuk membuat aplikasi saya berjalan pada Ruby <1.9.2 dan> = 1.9.2?
MEMPERBARUI
Klarifikasi: Saya tidak hanya menginginkan jawaban seperti "Anda dapat melakukan X" - pada kenyataannya, saya telah menyebutkan sebagian besar pilihan yang dipertanyakan. Saya ingin alasan , yaitu mengapa itu adalah praktik terbaik, apa pro dan kontra dan mengapa harus dipilih di antara yang lain.
a.rb
dan ingin membuat penerjemah membaca dan mem-parsing isi file b.rb
dalam direktori saat ini (biasanya dir yang sama dengan a.rb
), Anda hanya akan menulis require 'b'
dan itu akan baik-baik saja karena jalur pencarian default termasuk direktori saat ini. Dalam Ruby 1.9 yang lebih modern, Anda harus menulis require_relative 'b'
dalam hal ini, karena require 'b'
hanya akan mencari di jalur perpustakaan standar. Itulah hal yang merusak kompatibilitas maju dan mundur untuk skrip sederhana yang tidak akan diinstal dengan benar (misalnya, instal skrip sendiri).
backports
hanya untuk require_relative
, lihat jawaban saya ...
require
danrequire_relative
?