2015-10-31 51 views
1

我写一个宝石,看起来这样的:避免依赖的加载顺序

lib/my_gem.rb

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

这一直很好,直到最近,当创业板已经增加了更多的功能和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! 

我结束了在该文件中有一个烂摊子,由于全部依赖于秩序,我觉得必须有一个更好的办法?

+1

为什么你不需要“基本”文件中的'应用程序',如果它取决于它? – spickermann

+0

@spickermann这是一个合理的问题,我试图避免在每个依赖它的文件中都需要'app'。相反,我认为我可以加载一次并完成。 – Anthony

回答

2

尝试使用Kernel#autoload

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

的想法是,源文件未加载,直到它定义的模块/类是使用,所以你不需要采取需要的顺序照顾源文件。