如果我想,最好的做法是什么require
Ruby 中的相对文件and我希望它在 1.8.x 和 >=1.9.2 中都能工作?
我看到几个选项:
- just do
$LOAD_PATH << '.'
并忘记一切
- do
$LOAD_PATH << File.dirname(__FILE__)
require './path/to/file'
- 检查是否
RUBY_VERSION
require_relative as require
, use require_relative
以后需要的地方
- 检查是否
require_relative
已经存在,如果存在,请尝试按照之前的情况进行操作
- 使用奇怪的结构,例如
require File.join(File.dirname(__FILE__), 'path/to/file')
- 唉,它们似乎不能完全在 Ruby 1.9 中工作,因为,例如:$ 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')
似乎可以工作,但是很奇怪而且不太好看。
- Use 向后移植gem - 它有点重,它需要 rubygems 基础设施并包含大量其他解决方法,而我只是想要
require
处理相关文件。
有一个StackOverflow 上密切相关的问题这给出了更多示例,但没有给出明确的答案 - 这是最佳实践。
是否有任何体面的、被大家接受的通用解决方案可以让我的应用程序在 Ruby =1.9.2 上运行?
UPDATE
澄清:我不想要像“你可以做 X”这样的答案 - 事实上,我已经提到了大多数有问题的选择。我想理由, i.e. why这是一种最佳实践,它的优点和缺点是什么,以及为什么应该在其他实践中选择它。
一个解决方法刚刚添加到“aws”gem 中,所以我想分享一下,因为它受到这篇文章的启发。
https://github.com/appoxy/aws/blob/master/lib/awsbase/require_relative.rb
unless Kernel.respond_to?(:require_relative)
module Kernel
def require_relative(path)
require File.join(File.dirname(caller[0]), path.to_str)
end
end
end
这允许您使用require_relative
就像在 ruby 1.9.2 中、在 ruby 1.8 和 1.9.1 中一样。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)