แนวปฏิบัติที่ดีที่สุดคืออะไรหากฉันต้องการrequire
ไฟล์สัมพัทธ์ใน Ruby และฉันต้องการให้มันทำงานทั้งใน 1.8.x และ> = 1.9.2
ฉันเห็นตัวเลือกไม่กี่:
- แค่ทำ
$LOAD_PATH << '.'
และลืมทุกสิ่ง - ทำ
$LOAD_PATH << File.dirname(__FILE__)
require './path/to/file'
- ตรวจสอบว่า
RUBY_VERSION
<1.9.2 แล้วกำหนดrequire_relative
เป็นrequire
ใช้require_relative
ทุกที่ที่จำเป็นหลังจากนั้น - ตรวจสอบว่า
require_relative
มีอยู่แล้วหากเป็นเช่นนั้นให้ลองดำเนินการต่อเหมือนในกรณีก่อนหน้า - ใช้สิ่งก่อสร้างแปลก ๆ เช่น- อนิจจาพวกมันดูเหมือนจะไม่ทำงานใน Ruby 1.9 ตลอดไปเพราะตัวอย่างเช่น:
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>'
- แม้การก่อสร้างที่ผิดปกติ: ดูเหมือนว่าจะใช้งานได้ แต่มันดูแปลกและไม่ค่อยดีนัก
require File.join(File.expand_path(File.dirname(__FILE__)), 'path/to/file')
- ใช้backport gem - มันหนักมากมันต้องใช้โครงสร้างพื้นฐาน rubygems และมีวิธีแก้ไขอื่น ๆ มากมายในขณะที่ฉันต้องการ
require
ทำงานกับไฟล์ที่เกี่ยวข้อง
มีคำถามที่เกี่ยวข้องอย่างใกล้ชิดที่ StackOverflowซึ่งให้ตัวอย่างเพิ่มเติม แต่ก็ไม่ได้ให้คำตอบที่ชัดเจนซึ่งเป็นแนวปฏิบัติที่ดีที่สุด
มีโซลูชันสากลที่เหมาะสมและเป็นที่ยอมรับโดยทุกคนเพื่อให้แอปพลิเคชันของฉันทำงานทั้ง Ruby <1.9.2 และ> = 1.9.2 หรือไม่
UPDATE
การชี้แจง: ฉันไม่ต้องการเพียงแค่คำตอบเช่น "คุณทำได้ X" - อันที่จริงแล้วฉันได้พูดถึงตัวเลือกที่เป็นปัญหาอยู่แล้ว ฉันต้องการเหตุผลคือทำไมมันเป็นวิธีปฏิบัติที่ดีที่สุดข้อดีและข้อเสียของมันคืออะไรและทำไมจึงควรเลือกในหมู่คนอื่น ๆ
a.rb
และต้องการให้ล่ามอ่านและแยกเนื้อหาของไฟล์b.rb
ในไดเรกทอรีปัจจุบัน (ปกติจะเป็น dir เดียวกับa.rb
) คุณจะเขียนrequire 'b'
และมันจะดีเพราะเส้นทางการค้นหาเริ่มต้นรวมถึงไดเรกทอรีปัจจุบัน ใน Ruby 1.9 ที่ทันสมัยกว่าคุณจะต้องเขียนrequire_relative 'b'
ในกรณีนี้เช่นrequire 'b'
เดียวกับการค้นหาในเส้นทางไลบรารีมาตรฐานเท่านั้น นั่นคือสิ่งที่ชนิดของการหยุดพักไปข้างหน้าและความเข้ากันได้แบบย้อนกลับสำหรับสคริปต์ที่ง่ายกว่าซึ่งจะไม่ถูกติดตั้งอย่างถูกต้อง (ตัวอย่างเช่นติดตั้งสคริปต์เอง)
backports
เพื่อrequire_relative
ดูคำตอบของฉัน ...
require
และrequire_relative
?