我看到几个选项:
- 只需做
$LOAD_PATH << '.'
并忘记一切。
- 做$LOAD_PATH << File.dirname(__FILE__)
。
- require './path/to/file'
。
- 检查RUBY_VERSION
< 1.9.2,然后将require_relative
定义为require
,在以后需要使用require_relative
的地方使用它。
- 检查是否已经存在require_relative
,如果是,则尝试像前一种情况一样继续进行。
- 使用奇怪的构造,例如eval '__FILE__'
或eval 'File.dirname(__FILE__) + "/relative/path/to/file"' \_\_FILE\_\_
。require File.join(File.dirname(__FILE__), 'path/to/file')
- 不幸的是它们似乎不能在Ruby 1.9中完全工作,因为例如:<code>$ 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>'</code>
即使更奇怪的结构: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”这样的答案-事实上,我已经在问题中提到了大部分选择。我想要的是理由,即它为什么是最佳实践,它的优缺点以及为什么应该选择它而不是其他方法。
require
和require_relative
之间的区别吗? - Colonel Panica.rb
并希望解释器读取和解析当前目录(通常与a.rb
相同)中的文件b.rb
内容,你只需写require 'b'
即可,因为默认搜索路径包括当前目录。在较新的Ruby 1.9中,你需要写require_relative 'b'
来实现这一点,因为require 'b'
只会在标准库路径中搜索。这种情况可能会破坏向前和向后兼容性,特别是对于不需要正确安装(例如安装脚本本身)的简单脚本。 - GreyCatbackports
来进行require_relative
操作,详见我的回答... - Marc-André Lafortune