कमांड "रेक एसेट्स: प्रीकंपाइल" मेरे लिए बहुत धीमी गति से काम करता है। विशेष रूप से मेरे Amazon EC2 माइक्रो प्रोडक्शन सर्वर पर जिसमें बहुत सारे प्रोसेसर संसाधन नहीं हैं। ईसी 2 पर मुझे अकेले इस प्रीकंपाइल कार्य के लिए प्रत्येक तैनाती के दौरान 1 मिनट या उससे अधिक इंतजार करना पड़ता है। क्या इसे तेज करने का कोई तरीका है?

पहले मैंने css और JS को संपीड़ित/छोटा करने के लिए Jammit का उपयोग किया था। Jammit ने उसी वेब साइट और सर्वर पर लगभग 10 गुना तेजी से काम किया।

25
Evgenii 24 सितंबर 2011, 10:40
2
आप तैनाती से पहले अपनी संपत्ति को पूर्व-संकलित कर सकते हैं
 – 
Marian Theisen
24 सितंबर 2011, 10:44
1
ठीक है, मैंने इसके बारे में सोचा। लेकिन मुझे नहीं पता कि मैं प्रीकंपील्ड संपत्तियों को आसानी से उत्पादन में कैसे तैनात करूंगा। मैं कैपिस्ट्रानो का उपयोग कर रहा हूं और हर बार यह प्रीकंपिल्ड संपत्तियों को गिट करने के लिए प्रतिबद्ध करेगा। मेरी चिंता यह है कि पिछले सभी संपत्तियों के इतिहास को ध्यान में रखते हुए, इस मामले में गिट भंडार तेजी से बढ़ेगा। और वह सिर्फ css/js नहीं है - बल्कि सभी एसेट इमेज भी हैं।
 – 
Evgenii
25 सितंबर 2011, 16:34
2
यह मेरे लिए भी बेहद धीमा है (135,987ms = ~ 2 मिनट)। मुझे तैनाती से पहले प्रीकंपलिंग में देखना होगा ... मैं उन्हें गिट में भी जोड़ने के बारे में चिंतित हूं, ज्यादातर इसलिए कि इससे गिट लॉग में बहुत अधिक शोर जुड़ जाएगा। मैं अनुशंसा करता हूं कि उन्हें गिट में न जोड़ें - बस rsync उस निर्देशिका को स्थानीयहोस्ट से आपके वेबसर्वर पर आपकी कैप तैनाती स्क्रिप्ट के हिस्से के रूप में।
 – 
Tyler Rick
19 नवम्बर 2011, 00:18
यदि आपको रेल वातावरण लोड करने की आवश्यकता नहीं है, तो आपको इसे इसके साथ अक्षम करना चाहिए: config.assets.initialize_on_precompile = false
 – 
ndbroadbent
16 जिंदा 2012, 10:52

3 जवाब

सबसे बढ़िया उत्तर

यदि आपको रेल पर्यावरण को लोड करने की आवश्यकता नहीं है, तो आपको इसे इसके साथ अक्षम करना चाहिए:

config.assets.initialize_on_precompile = false

संपादित करें: मैंने अभी इस समस्या को हल करने के लिए एक रत्न लिखा है, जिसे turbo-sprockets-rails3 कहा जाता है। यह आपके assets:precompile को केवल बदली हुई फ़ाइलों को फिर से संकलित करके, और सभी संपत्तियों को उत्पन्न करने के लिए केवल एक बार संकलित करके गति देता है।

यह बहुत अच्छा होगा यदि आप मुझे turbo-sprockets-rails3 रत्न का परीक्षण करने में मदद कर सकें, और मुझे बताएं कि क्या आपको कोई समस्या है।

30
ndbroadbent 26 अक्टूबर 2012, 02:39
3
आपका रत्न कमाल का है। d3 और पूर्व-संकलन के साथ मेरी समस्या का समाधान किया। धन्यवाद दोस्त
 – 
chaostheory
1 नवम्बर 2012, 02:03

एक Rails 3.1.0 में एक बग है जिसमें प्रीकंपाइल प्रक्रिया में बहुत सारी फाइलें शामिल हैं। यदि आपके पास कई संपत्तियां जेएस और सीएसएस संपत्तियां हैं तो यह धीमेपन का कारण हो सकता है।

दूसरा यह है कि स्प्राकेट्स (संकलन करने वाला रत्न) अधिक जटिल है और इसमें अधिक विकल्प - एससीएसएस, कॉफ़ीस्क्रिप्ट और एआरबी की अनुमति है। इस वजह से मुझे संदेह है कि यह केवल संयोजन और खनन करने में धीमा होगा।

जैसा कि सुझाव दिया गया है, यदि यह अभी भी एक समस्या है तो आप उन्हें तैनात करने से पहले फ़ाइलों को प्रीकंपाइल कर सकते हैं।

10
Richard Hulse 25 सितंबर 2011, 07:43
विवरण के लिए आपका धन्यवाद। मुझे यह भी लगता है कि यह धीमा है क्योंकि इसे उत्पादन पर रेल पर्यावरण को लोड करने की जरूरत है, जो जमीत के मामले में नहीं था। मैं किसी भी हाल में जमात के पास वापस नहीं जा रहा हूं। मुझे एसेट पाइपलाइन बहुत पसंद है।
 – 
Evgenii
25 सितंबर 2011, 16:38

मेरा समाधान application.js .css और किसी भी अन्य एप्लिकेशन से संबंधित संपत्तियों को प्रीकंपिलेशन से बाहर करना है। ताकि मैं rake assets:precompile का उपयोग केवल इंजन से संबंधित संपत्तियों को प्रीकंपाइल करने के लिए कर सकूं।

फिर प्रत्येक तैनाती पर मैं किसी भी एप्लिकेशन से संबंधित संपत्ति बनाने और उन्हें manifest.yml में विलय करने के लिए एक साधारण रेक कार्य का उपयोग करता हूं:

namespace :assets do
  task :precompile_application_only => :environment do
    require 'sprockets'

    # workaround used also by native assets:precompile:all to load sprockets hooks 
    _ = ActionView::Base

    # ==============================================
    # = Read configuration from Rails / assets.yml =
    # ==============================================

    env           = Rails.application.assets
    target        = File.join(::Rails.public_path, Rails.application.config.assets.prefix)
    assets        = YAML.load_file(Rails.root.join('config', 'assets.yml'))
    manifest_path = Rails.root.join(target, 'manifest.yml')
    digest        = !!Rails.application.config.assets.digest
    manifest      = digest


    # =======================
    # = Old manifest backup =
    # =======================

    manifest_old = File.exists?(manifest_path) ? YAML.load_file(manifest_path) : {}

    # ==================
    # = Compile assets =
    # ==================

    compiler = Sprockets::StaticCompiler.new(env,
                                            target,
                                            assets,
                                            :digest => digest,
                                            :manifest => manifest)
    compiler.compile

    # ===================================
    # = Merge new manifest into old one =
    # ===================================

    manifest_new  = File.exists?(manifest_path) ? YAML.load_file(manifest_path) : {}

    File.open(manifest_path, 'w') do |out|
       YAML.dump(manifest_old.merge(manifest_new), out)
    end

  end
end

यह निर्दिष्ट करने के लिए कि कौन सी संपत्तियों को संकलित करना है, मैं एक वाईएएमएल कॉन्फ़िगरेशन फ़ाइल (config/assets.yml) का उपयोग करता हूं:

उदाहरण के लिए

---
- site/site.css
- admin/admin.css
- site/site.js
- admin/admin.js
1
mcasimir 24 जून 2012, 21:41