如果我想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
已经存在(如果存在),请尝试像以前一样进行 - 使用怪异的结构,例如-they,它们似乎无法完全在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上运行?
更新
澄清:我不想要像“您可以做X”之类的答案-实际上,我已经提到了大多数有问题的选择。我想要一个基本原理,即为什么它是一种最佳实践,它的优缺点是什么,为什么要在其他实践中选择它。
a.rb
并想让解释器读取和解析b.rb
当前目录中的文件内容(通常与dir相同a.rb
),则只需编写即可require 'b'
,因为默认搜索路径包括当前目录就可以了。在更现代的Ruby 1.9中,require_relative 'b'
在这种情况下,您将不得不编写代码,就像require 'b'
只在标准库路径中搜索一样。对于无法正确安装的简单脚本(例如,安装脚本本身)而言,这就是那种向前和向后兼容性的问题。
backports
只是require_relative
,看到我的答案...
require
和之间有什么区别require_relative
?