【问题标题】:Avoiding dependency load order避免依赖加载顺序
【发布时间】:2015-10-31 13:36:44
【问题描述】:

我正在写一个看起来像这样的 gem:

lib/my_gem.rb:

require 'base64'
require 'ostruct'
require 'my_gem/utils.rb'
require 'my_gem/base.rb'
...

这一直很好,直到最近 gem 添加了更多功能并且 lib/my_gem 目录不断增长。

现在,我必须非常小心地以非常特定的顺序处理require 我的类和模块,因为utils 中的某些内容要求首先加载base.rb。但是,base.rb 中的某些内容要求在此之前加载 app.rb。

所以变成了:

# require all standard libraries first
require 'base64'
require 'ostruct'
require 'my_gem/app.rb'  # be sure this is loaded before base!
require 'my_gem/base.rb' # be sure this is loaded before utils!
require 'my_gem/utils.rb' # be sure this is loaded before some other class!

由于依赖关系的顺序,我最终在这个文件中弄得一团糟,我觉得必须有更好的方法?

【问题讨论】:

  • 如果它依赖于base文件,为什么不要求app?
  • @spickermann 这是一个合理的问题,我试图避免在每个依赖它的文件中都使用require 'app'。相反,我认为我可以加载一次并完成。

标签: ruby


【解决方案1】:

尝试使用Kernel#autoload:

require 'base64'
require 'ostruct'
autoload :SomeModule, 'my_gem/app.rb'
autoload :AnotherModule, 'my_gem/base.rb'
autoload :SomeClass, 'my_gem/utils.rb'

这个想法是在使用其中定义的模块/类之前不会加载源文件,因此您不需要注意需要源文件的顺序。

【讨论】:

    猜你喜欢
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 2016-01-06
    相关资源
    最近更新 更多