Cách thực hành tốt nhất là gì nếu tôi muốn require
một tệp tương đối trong Ruby và tôi muốn nó hoạt động trong cả 1.8.x và> = 1.9.2?
Tôi thấy một vài lựa chọn:
- cứ làm đi
$LOAD_PATH << '.'
và quên mọi thứ - làm
$LOAD_PATH << File.dirname(__FILE__)
require './path/to/file'
- kiểm tra xem
RUBY_VERSION
<1.9.2, sau đó xác địnhrequire_relative
làrequire
, sử dụngrequire_relative
ở mọi nơi cần thiết sau đó - kiểm tra nếu
require_relative
đã tồn tại, nếu có, cố gắng tiến hành như trong trường hợp trước - sử dụng các cấu trúc kỳ lạ như - than ôi dường như chúng không hoạt động trong Ruby 1.9, bởi vì, ví dụ:
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>'
- Ngay cả xây dựng kỳ lạ: dường như hoạt động, nhưng nó kỳ lạ và không hoàn toàn đẹp.
require File.join(File.expand_path(File.dirname(__FILE__)), 'path/to/file')
- Sử dụng đá quý backports - loại này nặng, nó đòi hỏi cơ sở hạ tầng rubygems và bao gồm hàng tấn cách giải quyết khác, trong khi tôi chỉ muốn
require
làm việc với các tệp tương đối.
Có một câu hỏi liên quan chặt chẽ tại StackOverflow đưa ra một số ví dụ khác, nhưng nó không đưa ra câu trả lời rõ ràng - đó là một cách thực hành tốt nhất.
Có bất kỳ giải pháp phổ quát, được mọi người chấp nhận để làm cho ứng dụng của tôi chạy trên cả Ruby <1.9.2 và> = 1.9.2 không?
CẬP NHẬT
Làm rõ: Tôi không muốn chỉ có câu trả lời như "bạn có thể làm X" - thực tế, tôi đã đề cập đến hầu hết các lựa chọn trong câu hỏi. Tôi muốn lý do , tức là tại sao nó là một thực tiễn tốt nhất, ưu và nhược điểm của nó là gì và tại sao nó nên được chọn trong số những thứ khác.
a.rb
và muốn làm cho trình thông dịch đọc và phân tích nội dung của tệp b.rb
trong thư mục hiện tại (thường là cùng một thư mục với a.rb
), bạn chỉ cần viết require 'b'
và nó sẽ ổn vì đường dẫn tìm kiếm mặc định bao gồm thư mục hiện tại. Trong Ruby 1.9 hiện đại hơn, bạn sẽ phải viết require_relative 'b'
trong trường hợp này, vì require 'b'
sẽ chỉ tìm kiếm trong các đường dẫn thư viện tiêu chuẩn. Đó là điều phá vỡ khả năng tương thích tiến và lùi đối với các tập lệnh đơn giản hơn sẽ không được cài đặt đúng cách (ví dụ: tự cài đặt tập lệnh).
backports
chỉ để require_relative
xem câu trả lời của tôi ...
require
vàrequire_relative
?