2009-06-18 16 views
10

मैं लोड प्रक्रिया को समझने की कोशिश करने के लिए active_support.rb पर देख रहा था। यह तीन लोडिंग विधियों का उपयोग करता है: load_all!, autoload और require। उसी फ़ाइल में लोड होने के तीन अलग-अलग तरीकों का उपयोग क्यों करें?ऑटोलोड क्यों हैं, load_all! और सक्रिय_support.rb में उपयोग की जाने वाली सभी की आवश्यकता है?

module ActiveSupport 
    def self.load_all! 
    [Dependencies, Deprecation, Gzip, MessageVerifier, Multibyte, SecureRandom, TimeWithZone] 
    end 

    autoload :BacktraceCleaner, 'active_support/backtrace_cleaner' 
    autoload :Base64, 'active_support/base64' 
    autoload :BasicObject, 'active_support/basic_object' 
    autoload :BufferedLogger, 'active_support/buffered_logger' 
    autoload :Cache, 'active_support/cache' 
    autoload :Callbacks, 'active_support/callbacks' 
    autoload :Deprecation, 'active_support/deprecation' 
    autoload :Duration, 'active_support/duration' 
    autoload :Gzip, 'active_support/gzip' 
    autoload :Inflector, 'active_support/inflector' 
    autoload :Memoizable, 'active_support/memoizable' 
    autoload :MessageEncryptor, 'active_support/message_encryptor' 
    autoload :MessageVerifier, 'active_support/message_verifier' 
    autoload :Multibyte, 'active_support/multibyte' 
    autoload :OptionMerger, 'active_support/option_merger' 
    autoload :OrderedHash, 'active_support/ordered_hash' 
    autoload :OrderedOptions, 'active_support/ordered_options' 
    autoload :Rescuable, 'active_support/rescuable' 
    autoload :SecureRandom, 'active_support/secure_random' 
    autoload :StringInquirer, 'active_support/string_inquirer' 
    autoload :TimeWithZone, 'active_support/time_with_zone' 
    autoload :TimeZone, 'active_support/values/time_zone' 
    autoload :XmlMini, 'active_support/xml_mini' 
end 

require 'active_support/vendor' 
require 'active_support/core_ext' 
require 'active_support/dependencies' 
require 'active_support/json' 

I18n.load_path << "#{File.dirname(__FILE__)}/active_support/locale/en.yml" 

उत्तर

16

मुझे नहीं पता कि रेल तीन अलग-अलग लोडिंग विधियों का उपयोग क्यों करते हैं (वास्तव में दो - नीचे देखें)। लेकिन मुझे पता है, सामान्य रूप से, क्यों कोई हो सकता है।

Require का अर्थ है "अभी इसे लोड करें"। autoload का अर्थ है "इसे लोड करने के दौरान इसे लोड करें"। दोनों का उपयोग करने का सामान्य कारण यह है कि आपके पास कुछ फाइलें हैं जिन्हें आप बहुत अधिक मानते हैं कि प्रत्येक प्रोग्राम आमंत्रण में उपयोग किया जाएगा; और अन्य जो वैकल्पिक हैं। उदाहरण के लिए, एक रेल अनुप्रयोग में जो कोई बहिष्कृत विधियों का उपयोग नहीं करता है, आपको कभी भी Deprecation की आवश्यकता नहीं होगी; तो उस फ़ाइल को लोड करके प्रारंभिक सेटअप धीमा क्यों करें?

अन्य मामलों में, आप उन फ़ाइलों के बीच अंतर कर सकते हैं जिन्हें प्रोग्राम के निष्पादन में जल्दी और आवश्यक फ़ाइलों की आवश्यकता होगी। उदाहरण के लिए, आपको पहले अनुरोध के आने तक Gzip की आवश्यकता नहीं है। इसलिए ऑटोलोड का उपयोग करके, आप पहले अनुरोध के लिए मामूली मंदी की लागत पर शुरुआती सेटअप से कुछ समय ट्रिम कर सकते हैं।

आप पूछ सकते हैं, ठीक है, क्यों न केवल autoload का उपयोग सबकुछ के लिए करें? इसकी आवश्यकता होने से पहले कुछ भी लोड क्यों करें? एक कारण यह है कि ऑटोलोड केवल स्थिरांक के लिए काम करता है। इसलिए, उदाहरण के लिए, active_support/core_ext संख्यात्मक के लिए विधियों का एक समूह जोड़ता है ताकि आप 3.days, 6.minutes, और 16.seconds.ago जैसे कोड लिख सकें। 3.days में कोई स्थिरता नहीं है, इसलिए आप उस अभिव्यक्ति पर स्वत: लोड नहीं कर सकते हैं। (और आप Numeric को स्वत: लोड नहीं कर सकते हैं, क्योंकि बेस क्लास पहले ही लोड हो चुका है - यह केवल वे एक्सटेंशन हैं जिन्हें आप जोड़ना चाहते हैं।)

अंत में, यह कक्षा वास्तव में तीन लोडिंग विधियों का उपयोग नहीं करती है; यह दो का उपयोग करता है, और एक (प्रकार) प्रदान करता है। load_all!

# Preload all frameworks specified by the Configuration#frameworks. 
# Used by Passenger to ensure everything's loaded before forking and 
# to avoid autoload race conditions in JRuby. 

को Rails::Initializer द्वारा किया जाता है मैं विवरण पता नहीं है, और मैं नहीं जानता कि क्यों इन विशिष्ट मॉड्यूल पहले से लोड कर रहे हैं (और नहीं अन्य)। लेकिन चूंकि यह विशिष्ट वातावरण का समर्थन करने के लिए है, इसलिए आप देख सकते हैं कि इसे डिफ़ॉल्ट लोडिंग तंत्र से अलग कोड की आवश्यकता क्यों हो सकती है।

1

autoload रूबी विधि का उपयोग एक फ़ाइल नाम के साथ स्थिर को जोड़ने के लिए किया जा सकता है जिसे पहली बार संदर्भित संदर्भ में लोड किया जाएगा। यह आपको स्टार्टअप पर पूरे ढांचे को लोड करने से रोकता है।

ऐसा लगता है कि load_all! रेल initializer.rb रेल से कॉल किया जाता है, और इसका उपयोग पूर्व-लोड होने के लिए कॉन्फ़िगर किए गए सभी ढांचे को प्रीलोड करने के लिए किया जाता है। यह प्रत्येक ढांचे load_all! विधि को कॉल करके काम करता है, जो केवल स्थिरांक की एक सरणी को संदर्भित करता है ... जो ऑटोलोड को ट्रिगर करेगा।

preload_frameworks के लिए initializer.rb में टिप्पणी के अनुसार ...

# Preload all frameworks specified by the Configuration#frameworks. 
# Used by Passenger to ensure everything's loaded before forking and 
# to avoid autoload race conditions in JRuby. 

require विशेष ढांचे के लिए कोर आवश्यक फ़ाइलें लोड करने के लिए है।

संबंधित मुद्दे