2015-10-31 82 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' 

的想法是,源文件未加載,直到它定義的模塊/類是使用,所以你不需要採取需要的順序照顧源文件。