Ruby:require 与 require_relative - 在 Ruby <1.9.2 和 >=1.9.2 中运行的最佳实践

标签 ruby ruby-1.9 ruby-1.8

如果我想要,最佳实践是什么 require Ruby 中的一个相关文件 and 我希望它在 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已经存在,如果存在,尝试像之前的情况一样继续
  • 使用奇怪的结构,例如<pre><code>require File.join(File.dirname(__FILE__), 'path/to/file')</code></pre> - 唉,它们似乎不能完全在 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>
  • 甚至更奇怪的结构:<pre><code>require File.join(File.expand_path(File.dirname(__FILE__)), 'path/to/file')</code></pre>似乎可行,但它很奇怪而且不太好看。
  • 使用backports gem - 它有点重,它需要 ruby​​gems 基础设施并包含大量其他解决方法,而我只想要 require使用相关文件。

有一个 closely related question at StackOverflow这提供了更多示例,但没有给出明确的答案 - 这是最佳做法。

是否有任何体面的、被所有人接受的通用解决方案来使我的应用程序在 Ruby <1.9.2 和 >=1.9.2 上运行?

更新

澄清:我不想要像“你可以做 X”这样的答案 - 事实上,我已经提到了大部分有问题的选择。我想要理由,即为什么它是最佳实践,它的优点和缺点是什么,以及为什么应该从其他实践中选择它。

最佳答案

这个问题的解决方法刚刚添加到“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

这允许您像在 ruby​​ 1.9.2 和 ruby​​ 1.8 和 1.9.1 中一样使用 require_relative

关于Ruby:require 与 require_relative - 在 Ruby <1.9.2 和 >=1.9.2 中运行的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4333286/

相关文章:

Ubuntu 10.04 上的 Ruby 和 Qt 集成

Ruby 101 : How Can I Save, 读取、写入然后保存数组的内容?

ruby - 在 Shoes.app 中使文本透明

ruby-on-rails - Rubygems - 包在哪里下载?

ruby - 是否有可能在 Ruby 1.9 中获得哈希键的后继和前导?

mysql - 如何在 Ruby 1.9.2 + Rails3 中将表数据导出为 CSV 文件?

ruby - 在 Ruby CSV 中,如何将空白 , 而不是 ,""写入文件?

ruby - 在 Ruby 1.9 中使用 eval() 测试 Ruby 代码片段

c - 为什么 Ruby 1.8.7 中的 Symbol#to_proc 变慢了?

ruby - 使用 Datamapper 和 Sinatra 进行简单搜索