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

2023-12-08

如果我想,最好的做法是什么requireRuby 中的相对文件and我希望它在 1.8.x 和 >=1.9.2 中都能工作?

我看到几个选项:

  • just do $LOAD_PATH << '.'并忘记一切
  • do $LOAD_PATH << File.dirname(__FILE__)
  • require './path/to/file'
  • 检查是否RUBY_VERSIONrequire_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 - 它有点重,它需要 ruby​​gems 基础设施并包含大量其他解决方法,而我只是想要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(使用前将#替换为@)

Ruby:require 与 require_relative - 在 Ruby <1.9.2 和 >=1.9.2 中运行的解决方法的最佳实践 的相关文章

随机推荐