2012-07-15 6 views
10

में सशर्त रूप से संपत्ति प्रीकंपाइल अक्षम करें मैंने रेल में आलसी संपत्ति प्रीकंपाइल करने के लिए विभिन्न संकलित और आम तौर पर अप्रभावी समाधान देखा है। बैकएंड डेवलपर के रूप में, मैं विशेष रूप से संपत्तियों को पुन: संकलित नहीं करना चाहता हूं, जब भी प्रोग्राम तैनात नहीं होता है, लेकिन Capfile में load 'deploy/assets' के माध्यम से संपत्तियों को लोड किया जाता है, और deploy.rb में कोई कार्य परिभाषित करके नहीं, मैं एक तरीका नहीं सोच सकता सशर्त रूप से इसे अक्षम करें।कैपिस्ट्रानो

मैं जिस व्यवहार के बाद हूं, वह नियमित रूप से प्रीकंपाइल परिनियोजन के लिए cap deploy का उपयोग करना है और संपत्ति परिनियोजन को छोड़ने के लिए cap deploy:no_assets का उपयोग करना है।

उत्तर

7

रेल 4 इस मुद्दे को स्पॉकेट्स के नए संस्करण के साथ संबोधित करता है, जो केवल पूर्ववर्ती संपत्तियों को बदलता है। इस बीच, आपके rails3 ऐप्स के लिए मैं turbo-sprockets-rails3 मणि की अनुशंसा करता हूं।

यह मणि नाथन ब्रॉडबेंट, जो master में विलय नहीं कर रहे थे, क्योंकि समस्या पहले से ही rails4 में संबोधित किया गया था द्वारा sprockets-rails के लिए एक set of patches के रूप में बाहर शुरू कर दिया।

  • अपने रेल 3 रेक संपत्ति की गति: README से, precompile केवल बदल recompiling संपत्ति के द्वारा अपने स्रोत फ़ाइलों का एक हैश के आधार पर

  • केवल एक बार संकलित दोनों उंगलियों के निशान और गैर उत्पन्न करने के लिए -fingerprinted संपत्ति

और:

टर्बो-स्पॉकेट्स-रेल 3 को कैपिस्ट्रानो के नवीनतम संस्करण के साथ बॉक्स से बाहर काम करना चाहिए।

मैं पुष्टि कर सकता हूं कि यह मेरे लिए कैपिस्ट्रानो के साथ तैनात रेल-3.2.एक्स ऐप्स पर अच्छा काम करता है।

गिटहबर्स के लिए एक साइड नोट के रूप में, मूल pull request ओपन सोर्स प्रोजेक्ट को कोड सबमिट करने का एक उत्कृष्ट उदाहरण है, भले ही इसे विलय नहीं किया गया हो।

+1

बस इसे अपने आप स्विच कर दिया और अपने महान प्रमाणित कर सकते हैं! – RubberDucky

+2

मेरे पास रेल 4.0 है और मैं किसी भी संपत्ति को नहीं बदलता लेकिन यह आसानी से स्क्रैच से सब कुछ पुनः संकलित करता है। कोई उपाय? – scaryguy

1

यह सार बहुत आशाजनक https://gist.github.com/3072362

पिछले तैनाती से अपना Git लॉग की जाँच करता है अब अगर वहाँ %w(app/assets lib/assets vendor/assets Gemfile.lock config/routes.rb) में कोई परिवर्तन और यदि हां, तो केवल precompiles तो कर रहे हैं देखने के लिए करने के लिए लग रहा है।

+0

मैंने इस गिस्ट और इसे पहले के समान स्थापित किया है, लेकिन ऐसा कोई प्रभाव नहीं प्रतीत होता है। अगर मैं अपने कैपफ़ाइल में 'लोड' तैनाती/संपत्ति 'छोड़ देता हूं, तो आवश्यकता होने पर प्रीकंपाइल बंद नहीं होता है। अगर मैं 'लोड 'तैनाती/संपत्ति' लेता हूं, तो इसे तब भी प्रीकंपाइल नहीं किया जाता है जब इसकी आवश्यकता होती है। कोड अपडेट के बाद इसे आग लगाने के लिए एक अतिरिक्त ट्रिगर के साथ भी। – RubberDucky

+0

मुझे लगता है कि यह संभव है कि आपको अपनी कॉन्फ़िगर/deploy.rb फ़ाइल में इस गिस्ट की आवश्यकता नहीं है। यह तैनाती को ओवरराइट करता है: संपत्ति: प्रीकंपाइल कार्य। आपको अपने कैपफ़ाइल में 'लोड' तैनाती/संपत्ति 'रखना चाहिए। –

+0

यह अभी भी टर्बो-स्पॉर्केट-रेल की तुलना में तेज़ है, क्योंकि यह पूरी जांच छोड़ देता है, जो मेरे लिए मिनट लेता है। – lulalala

14

दोनों टर्बो-स्पॉर्केट-रेल और ऑटो-स्किप स्क्रिप्ट में कुछ नुकसान हैं (मैं बाद में उल्लेख करूंगा)। तो मैं निम्नलिखित हैक का उपयोग करें, इसलिए मैं अपने होगा पर संपत्ति precompile छोड़ एक पैरामीटर पारित कर सकते हैं:

callback = callbacks[:after].find{|c| c.source == "deploy:assets:precompile" } 
callbacks[:after].delete(callback) 
after 'deploy:update_code', 'deploy:assets:precompile' unless fetch(:skip_assets, false) 

यह स्क्रिप्ट में निर्मित परिसंपत्ति precompile हुक बदल जाएगा, तो यह झुका पर आधारित होगा skip_assets पैरामीटर। मैं संपत्ति प्रीकंपाइल को पूरी तरह से छोड़ने के लिए cap deploy -S skip_assets=true पर कॉल कर सकता हूं।


मेरे लिए, टर्बो-स्पॉर्केट-रेल अभी भी कुछ भी नहीं बदला है जब जांच करने के लिए मिनट लगते हैं।यह महत्वपूर्ण हो सकता है जब मुझे सर्वर एएसएपी को ठीक करने की आवश्यकता हो। इसलिए मुझे अपनी बल-छोड़ने की विधि चाहिए।

+0

इस कोड को आप काम करने के लिए कहां जोड़ते हैं? –

+0

@dtmunir मैंने इसे deploy.rb फ़ाइल के अंत में जोड़ा। – lulalala

+0

यह एक अच्छा समाधान है। Capistrano 2 के साथ एक रेल 4 ऐप पर और यह अभी भी काम करता है। बस सावधान रहना चाहिए कि आपके पास 'तैनाती: परिसंपत्तियों: प्रीकंपाइल' से जुड़ी कोई अन्य नौकरियां नहीं हैं या उन्हें भी छोड़ दिया जाएगा। –