2012-11-13 9 views
6

मैं अपने कैश को प्रारंभकर्ता के साथ पूर्ववत करना चाहता हूं, लेकिन मुझे rake या rails g आदि चलाने पर हर बार चलाने के लिए इस कोड की आवश्यकता नहीं है। रेक और बंडलर आसान हैं से निपटने के लिए है, लेकिन एक ऐसी ही समाधान जनरेटर के लिए काम नहीं करता:'रेल उत्पन्न करने' के दौरान शुरुआती से चलने से रोकने के लिए कैसे करें

# config/initializers/prepop_cache.rb 
if !defined?(::Bundler) and !defined?(::Rake) and !defined(Rails::Generators) 
    # do stuff 
end 

यह होना चाहिए, क्योंकि rails/generators (समान या कुछ और) रनटाइम पर require एड है। यह देखने के लिए मैं कैसे जांच सकता हूं कि आदेश चल रहा है rails g xyz है?

अद्यतन:

दो समाधान यहां पाया जा सकता: Rails 3 initializers that run only on `rails server` and not `rails generate`, etc

फिर भी अगर यह ढंग मैंने ऊपर की कोशिश की है में संभव है जानना चाहूंगा।

उत्तर

1

रेल 3, जो आप करना चाहते हैं वह संभवतः संभव है, लेकिन एक हैकी तरीके से। आइए जानें:

आप एक rails generate फोन करना है, callpath इस तरह दिखता है:

  • bin/rails, कहा जाता है जो अंततः जिन मार्गों पर execute script/rails
  • script/rails को क्रियान्वित किया जाता है जिसके लिए आवश्यक है rails/commands
  • rails/commands है भारित, जो फोकस का मुख्य बिंदु है।
rails/commands भीतर

कोड है कि उत्पन्न के लिए चलाता है:

ARGV << '--help' if ARGV.empty? 

aliases = { 
    "g" => "generate", 
    "c" => "console", 
    "s" => "server", 
    "db" => "dbconsole" 
} 

command = ARGV.shift      # <= #1 
command = aliases[command] || command 

case command 
when 'generate', 'destroy', 'plugin', 'benchmarker', 'profiler' 
    require APP_PATH 
    Rails.application.require_environment! # <= #2 
    require "rails/commands/#{command}"  # <= #3 

रुचि के स्थानों के ऊपर गिने जा रहे हैं। अर्थात्, बिंदु #1 पर जो आदेश आप चला रहे हैं वह ARGV से स्थानांतरित हो रहा है। आपके मामले में कौन सा मतलब है generate कमांड लाइन तर्क से हटा दिया जा रहा है।

बिंदु #2 पर आपका पर्यावरण लोड हो जाता है, जिस बिंदु पर आपके प्रारंभिक कार्यकर्ताओं को निष्पादित किया जा रहा है। और यहां कठिन हिस्सा है - क्योंकि इस बिंदु पर एक विशिष्ट कमांड को इंगित करने वाला कुछ भी लोड नहीं किया गया है (यह #3 पर होता है) जनरेटर को चलाने के लिए कोई जानकारी नहीं है!

के जो उपलब्ध है अगर हम rails generate model meep दौड़ा देखने के लिए config/initializer/debug.rb में एक स्क्रिप्ट सम्मिलित करते हैं:

puts $0  #=> "script/rails" 
puts ARGV #=> ["model", "meep"] 

आप देख सकते हैं, वहाँ कोई प्रत्यक्ष जानकारी है कि एक जनरेटर चलाने जा रहा है है। उस ने कहा, अप्रत्यक्ष जानकारी है। अर्थात् ARGV[0] #=> "model"। निश्चित रूप से आप संभावित जनरेटर की एक सूची बना सकते हैं और यह देखने के लिए जांच सकते हैं कि क्या जनरेटर ARGV[0] पर कॉल किया गया है या नहीं। मेरे में जिम्मेदार डेवलपर कहता है कि यह एक हैक है और उन तरीकों से तोड़ सकता है जिनकी आप उम्मीद नहीं करेंगे इसलिए मैं इस सावधानी से उपयोग करूंगा।

एकमात्र अन्य विकल्प script/rails को संशोधित करना है जैसा कि आपने सुझाव दिया है - जो समाधान बहुत खराब नहीं है, लेकिन जब आप रेल 4 में अपग्रेड करते हैं तो संभवतः ब्रेक हो जाएगा।


में रेल 4, आप और अधिक आशा मिल गया है! application environment is being loaded तक, जेनरेटर नेमस्पेस पहले ही लोड हो चुका है। इसका मतलब है कि प्रारंभकर्ता में आप निम्न कार्य कर सकते हैं:

if defined? Rails::Generators #=> "constant" 
    # code to run if generators loaded 
else 
    # code to run if generators not loaded 
end 
संबंधित मुद्दे