如果我想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')
- 使用backports gem - 它有点重,它需要 rubygems 基础架构并包含大量其他解决方法,而我只想
require
使用相关文件。
StackOverflow 上有一个密切相关的问题,它提供了更多示例,但没有给出明确的答案——这是最佳实践。
是否有任何体面的、被所有人接受的通用解决方案来让我的应用程序同时在 Ruby <1.9.2 和 >=1.9.2 上运行?
更新
澄清:我不想要像“你可以做 X”这样的答案——事实上,我已经提到了大多数有问题的选择。我想要基本原理,即为什么它是最佳实践,它的优点和缺点是什么以及为什么应该在其他方法中选择它。