config.assets.compile = रेल उत्पादन में सच, क्यों नहीं?


185

डिफ़ॉल्ट एप्लिकेशन स्थापित रेल द्वारा rails newहै config.assets.compile = falseउत्पादन में।

और चीजों को करने का सामान्य तरीका यह है rake assets:precompileकि आप अपने ऐप को तैनात करने से पहले चलाएं , यह सुनिश्चित करने के लिए कि सभी परिसंपत्ति पाइपलाइन परिसंपत्तियां संकलित हैं।

तो क्या होता है अगर मैं config.assets.compile = trueउत्पादन में सेट करता हूं ?

मुझे precompileअब दौड़ने की जरूरत नहीं है। मेरा मानना ​​है कि ऐसा होने पर पहली बार किसी संपत्ति का अनुरोध किया जाता है, इसे संकलित किया जाएगा। यह एक प्रदर्शन हिट होगा जो पहली बार (और इसका मतलब है कि आपको आमतौर पर इसे करने के लिए उत्पादन में js रनटाइम की आवश्यकता होती है)। लेकिन इन डाउनसाइड्स के अलावा, एसेट के आलसी होने के बाद, मुझे लगता है कि उस एसेट की बाद की सभी पहुंच में कोई परफॉर्मेंस हिट नहीं होगी , ऐप की परफॉर्मेंस इस शुरुआती फर्स्ट-हिट आलसी कॉम्प्लेक्शन के बाद प्रीकॉम्पलेटेड एसेट्स की तरह ही होगी । क्या ये सच है?

क्या मुझे कुछ याद आ रहा है? config.assets.compile = trueउत्पादन में सेट नहीं करने के लिए कोई अन्य कारण ? अगर मुझे उत्पादन में जेएस रनटाइम मिला है, और मैं किसी परिसंपत्ति की पहली पहुंच के लिए अपमानित प्रदर्शन का ट्रेडऑफ लेने के लिए तैयार हूं , तो बदले में नहीं चलने के लिए precompile, क्या यह समझ में आता है?


1
चेतावनी, sprockets के पुराने संस्करणों के एक बग होते हैं और अगर config.assets.compile सच करने के लिए कॉन्फ़िगर किया गया है वहाँ निर्देशिका trasversal असुरक्षा की संभावना रहती है (है blog.heroku.com/rails-asset-pipeline-vulnerability )
मौरो

यह ठीक उसी तरह है जैसे कि स्टैकओवरफ्लो को काम करना है। एक अच्छा लिखित प्रश्न और एक अच्छा लिखित उत्तर। मैं तुमसे प्यार करता हूँ दोनों सेशन और @ richard-hulse।
शमीजोस

जवाबों:


259

मैंने उस गाइड का थोड़ा सा लिखा।

आप निश्चित रूप से उत्पादन में संकलित नहीं रहना चाहते हैं।

जब आप संकलन करते हैं, तो यही होता है:

फ़ाइल के लिए प्रत्येक अनुरोध / संपत्ति Sprockets को पारित किया है। कैश के लिए (आमतौर पर फाइलसिस्टम) जो भी रेल का उपयोग कर रहा है, उसमें से प्रत्येक संपत्ति के लिए पहले अनुरोध पर इसे संकलित और कैश किया जाता है।

बाद के अनुरोधों पर Sprockets अनुरोध प्राप्त करता है और फ़िंगरप्रिंट किए गए फ़ाइल नाम को देखना पड़ता है, यह जांचें कि फ़ाइल (छवि) या फ़ाइलें (css और js) जो कि संपत्ति बनाती हैं, संशोधित नहीं हुई थीं, और फिर अगर कोई कैश्ड संस्करण है तो सेवा करें।

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

यह ओवरहेड का एक बहुत है, ईमानदार होने के लिए, कोड गति के लिए अनुकूलित नहीं है।

यह इस बात पर प्रभाव डालेगा कि ग्राहक के पास कितनी तेज संपत्ति तार पर जाती है, और आपकी साइट के पृष्ठ लोड समय को नकारात्मक रूप से प्रभावित करेगी।

डिफ़ॉल्ट के साथ तुलना करें:

जब संपत्तियां प्री-कंपाइल की जाती हैं और संकलन बंद हो जाता है, तो संपत्तियां संकलित की जाती हैं और उन्हें फिंगरप्रिंट किया जाता है public/assets। Sprockets, रेल के लिए फ़ाइलनाम के लिए सादे की एक मैपिंग तालिका लौटाता है, और Rails फाइल सिस्टम को यह लिखता है। मैनिफ़ेस्ट फ़ाइल (RML 3 में RML या RAIL 4 में यादृच्छिक नाम के साथ JSON) को स्टार्टअप पर रेल द्वारा मेमोरी में लोड किया जाता है और एसेट हेल्पर विधियों द्वारा उपयोग के लिए कैश किया जाता है।

यह सही फिंगरप्रिंट वाली परिसंपत्तियों के साथ पृष्ठों की पीढ़ी को बहुत तेज़ बनाता है, और फ़ाइलों की सेवा स्वयं वेब-सर्वर-से-द-फाइलसिस्टम तेजी से होती है। दोनों नाटकीय रूप से लाइव संकलन से अधिक तेज हैं।

पाइपलाइन और फिंगरप्रिंटिंग का अधिकतम लाभ प्राप्त करने के लिए, आपको अपने वेब सर्वर पर भविष्य के हेडर सेट करने की आवश्यकता है, और js और css फ़ाइलों के लिए gzip कम्प्रेशन को सक्षम करें। Sprockets संपत्ति के gzipped संस्करण लिखता है जिसे आप अपने सर्वर का उपयोग करने के लिए सेट कर सकते हैं, प्रत्येक अनुरोध के लिए ऐसा करने की आवश्यकता को हटा सकते हैं।

इससे क्लाइंट को जितनी जल्दी हो सके उतनी तेजी से संपत्ति मिल जाती है, और संभव है कि सबसे छोटे आकार में, पेजों के क्लाइंट-साइड डिस्प्ले को तेज किया जाए, और दूर के हेडर के साथ रिक्वेस्ट को कम किया जाए।

तो अगर आप लाइव संकलन कर रहे हैं:

  1. बहुत धीमी गति से
  2. संपीड़न में कमी
  3. प्रभाव पृष्ठों के समय प्रस्तुत करना होगा

बनाम

  1. जितनी जल्दी हो सके
  2. दबा हुआ
  3. सर्वर (वैकल्पिक रूप से) से अधिक दबाव हटाइए।
  4. पृष्ठों का रेंडर समय कम से कम करें।

संपादित करें: (टिप्पणी का अनुसरण करने का उत्तर)

पहले अनुरोध पर पाइपलाइन को बदला जा सकता था लेकिन ऐसा करने में कुछ बड़ी बाधाएँ हैं। पहला यह है कि फ़िंगरप्रिंट किए गए नामों के लिए लुकअप तालिका होनी चाहिए या सहायक विधियाँ बहुत धीमी हैं। एक संकलित-ऑन-डिमांड सेनेरियो के तहत लुकअप टेबल पर अपील करने के लिए कुछ तरीका होना चाहिए क्योंकि प्रत्येक नई संपत्ति संकलित या अनुरोध की जाती है।

इसके अलावा, किसी को अज्ञात परिसंपत्तियों के लिए धीमी परिसंपत्ति वितरण की कीमत का भुगतान तब तक करना होगा जब तक कि सभी संपत्तियां संकलित और जगह पर न हों।

डिफ़ॉल्ट, जहां एक बार में सब कुछ संकलित करने की कीमत का भुगतान ऑफ-लाइन किया जाता है, सार्वजनिक आगंतुकों को प्रभावित नहीं करता है और यह सुनिश्चित करता है कि सब कुछ जीवित रहने से पहले काम करता है।

डील-ब्रेकर यह है कि यह उत्पादन प्रणालियों में बहुत अधिक जटिलता जोड़ता है।

[संपादित करें, जून २०१५] यदि आप इसे पढ़ रहे हैं क्योंकि आप एक तैनाती के दौरान धीमे संकलन समय के लिए एक समाधान की तलाश कर रहे हैं, तो आप स्थानीय स्तर पर परिसंपत्तियों को तैयार करने पर विचार कर सकते हैं। इस पर जानकारी परिसंपत्ति पाइपलाइन गाइड में है । यह आपको स्थानीय रूप से केवल तभी बदलने की अनुमति देता है, जब कोई परिवर्तन होता है, यह प्रतिबद्ध करता है, और फिर बिना किसी पूर्व-गति के चरण के साथ तेजी से तैनात होता है।


1
धन्यवाद, मैंने आपका उत्तर स्वीकार कर लिया है। लेकिन अब मेरा सवाल है, ठीक है, यह अब ऐसा नहीं करता है, लेकिन क्या आपको लगता है कि एसेट पाइप लाइन में एक सुविधा हो सकती है जहां यह पहले अनुरोध पर आलसी हो जाती है, यह बिल्कुल precompile की तरह कर रही है, जिसमें लिखने के लिए .public और अद्यतन शामिल है। फिंगरप्रिंट प्रकट?
jrochkind

ऊपर देखो। क्या यह एक मुद्दा है क्योंकि Capistrano आपके लिए काम नहीं करता है?
रिचर्ड हल्स

मैं Capistrano का उपयोग नहीं करता। मुझे पहले की जरूरत नहीं है, जोड़ा जटिलता इसके लायक नहीं थी। शायद परिसंपत्ति पाइपलाइन पुआल है जो ऊंटों को वापस तोड़ देता है और इसकी आवश्यकता होती है। आपकी राय में, कैपिस्ट्रानो या समान के बिना परिसंपत्ति पाइपलाइन के साथ रेल डिपो का प्रबंधन करना संभव है ? यह शर्म की बात है, सरल सेटअप के लिए इसे हाथ से करने के लिए एक बड़ी समस्या नहीं थी।
20-13 को jrochkind

आपको वास्तव में Cap 3.1 के लिए Capistrano की आवश्यकता है। परिसंपत्तियाँ एक नई सार्वजनिक निर्देशिका में संकलित की जाती हैं, जबकि आपका पुराना ऐप अभी भी चल रहा है। जब कंपाइल किया जाता है तो नया वर्जन सीलिंक हो जाता है और सर्वर अपने आप रीस्टार्ट हो जाता है।
रिचर्ड हल्से

"पाइपलाइन और फ़िंगरप्रिंटिंग का अधिकतम लाभ प्राप्त करने के लिए, आपको अपने वेब सर्वर पर भविष्य के हेडर सेट करने की आवश्यकता है, और js और css फ़ाइलों के लिए gzip संपीड़न सक्षम करें।" - क्या आप कैसे करें इसके लिए कुछ निर्देश या लिंक प्रदान कर सकते हैं। यह?
इसहाक बेतेश

7

प्री-कंपाइलिंग चीज़ के साथ कम ओवरहेड होना।

Precompile everything initially with these settings in production.rb
# Precompile *all* assets, except those that start with underscore
config.assets.precompile << /(^[^_\/]|\/[^_])[^\/]*$/

फिर आप बस .html /erb या "/assets/stylesheet.css" के रूप में छवियों और शैलियों का उपयोग कर सकते हैं। "/assets/web.png"


6

हरोकू का उपयोग करने वाले किसी के लिए:

यदि आप हर्को के लिए तैनात हैं, तो यह आपके लिए तैनाती के दौरान स्वचालित रूप से precompile करेगा यदि संकलित संपत्ति शामिल नहीं है (यानी public/assetsप्रतिबद्ध नहीं है) तो इसकी कोई आवश्यकता नहीं हैconfig.assets.compile = true , या पहले से तैयार की गई परिसंपत्तियों को करने के लिए।

हरोकू के डॉक्स यहां हैं । एक CDN dyno संसाधन पर भार को दूर करने की सिफारिश की है।


1

यह पहले से हिट होने के बाद भी precompiling के समान नहीं होगा: क्योंकि फाइलें उन फाइल सिस्टम के लिए नहीं लिखी जाती हैं जिन्हें वे सीधे वेब सर्वर द्वारा सेवित नहीं किया जा सकता है। कुछ रूबी कोड हमेशा शामिल होंगे, भले ही वह कैश प्रविष्टि को पढ़ता हो।


हम्म, मैंने सोचा था कि precompile=trueसंकलित परिसंपत्तियों के साथ फाइल सिस्टम को लिखा जाएगा। क्या आपको यकीन है? मुझे चेक करने दो ...
jrochkind

1
बाह, मुझे लगता है कि आप सही हैं - वे फ़ाइल सिस्टम के लिए लिखे गए हैं, लेकिन यह इसके tmp/cacheबजाय ऐसा दिखता है public/assets, इसलिए ऐसा स्थान नहीं जिसे वेब सर्वर देख सकता है, वे अभी भी रेल ऐप द्वारा सेवा नहीं करेंगे वेब सर्वर। blah। क्या यह सही है, आपको लगता है?
जिरकोकिंड

सही बात। के रूप में तेजी से वेब सर्वर के रूप में उन्हें सही लेने नहीं होगा। इससे कोई फर्क नहीं पड़ता कि आप अपने ऐप के सामने क्लाउडफ्रंट जैसी सीडीएन डालते हैं
फ्रेडरिक च्युंग

1

सेट config.asset.compile = false

अपने Gemfile में जोड़ें

group :assets do gem 'turbo-sprockets-rails3' end

बंडल स्थापित करें

Daud rake assets:precompile

फिर अपना सर्वर शुरू करें


जहाँ तक मैंने config.asset.compile = true in production.rbफ़ाइल सेट की है, क्योंकि कोई पूर्व-संकलित तंत्र नहीं जोड़ा गया है। हर बार जब हम सर्वर शुरू करते हैं तो पेज लोड करने में बहुत समय लगता है (जब अनुरोध दोनों अनुरोधों को संसाधित करता है और संपत्ति का संकलन करता है)। अब मैं turbo-sprockets-rails3Gemfile में शामिल था और कमांड को चलाने से rake assets:precompileपहले संपत्तियों को संकलित करता था। अब मैं config.asset.compile = false in production.rbसर्वर को सेट करता हूं और शुरू करता हूं , बिना किसी देरी के पेज लोड हो रहा है। (केवल परिसंपत्ति संकलन के बिना अनुरोध को संसाधित करना)
मोहम्मद सलीम

2
यह कहने लायक है कि turbo-sprockets-rails3रूबी 3 पर केवल आवश्यक है
आंद्रे फिगएरेडियो

0

आधिकारिक गाइड से :

पहले अनुरोध पर संपत्ति संकलित की जाती है और ऊपर के विकास में उल्लिखित है, और एमडी 5 हैश को शामिल करने के लिए सहायकों में उपयोग किए गए प्रकट नामों को बदल दिया जाता है।

Sprockets अधिकतम आयु = 31536000 तक कैश-कंट्रोल HTTP हेडर भी सेट करता है। यह आपके सर्वर और क्लाइंट ब्राउज़र के बीच सभी कैश को इंगित करता है कि यह सामग्री (सेवा की गई फ़ाइल) 1 वर्ष के लिए कैश की जा सकती है। इसका प्रभाव आपके सर्वर से इस संपत्ति के लिए अनुरोधों की संख्या को कम करना है; संपत्ति में स्थानीय ब्राउज़र कैश या कुछ मध्यवर्ती कैश में होने का एक अच्छा मौका है।

यह मोड अधिक मेमोरी का उपयोग करता है, डिफ़ॉल्ट की तुलना में खराब प्रदर्शन करता है और अनुशंसित नहीं है।

इसके अलावा, अगर आप अपने deploys के लिए Capistrano का उपयोग करते हैं, तो precompile कदम परेशानी नहीं है । यह आपके लिए देखभाल करता है। तुम बस दौड़ो

cap deploy

या (आपके सेटअप के आधार पर)

cap production deploy

और आप सभी सेट हैं। यदि आप अभी भी इसका उपयोग नहीं करते हैं, तो मैं इसकी जाँच करने की अत्यधिक सलाह देता हूं।


तो क्या आपको लगता है कि आधिकारिक गाइड की भाषा मेरे साथ सहमत है? मैंने उस गाइड को देखा है, मुझे यकीन नहीं है कि अगर इसका मतलब है कि मैं ऊपर क्या सुझाव दे रहा हूं, तो आपको क्या लगता है? यह मेरा सवाल है।
jrochkind

हां, आप मूल रूप से एक ही बात कहते हैं। मेरा सुझाव है कि आप लाइव संकलन चालू न करें।
सर्जियो तुलेंत्सेव

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.