कमांड "रेक एसेट्स: प्रीकंपाइल" मेरे लिए बहुत धीमी गति से काम करता है। विशेष रूप से मेरे Amazon EC2 माइक्रो प्रोडक्शन सर्वर पर जिसमें बहुत सारे प्रोसेसर संसाधन नहीं हैं। ईसी 2 पर मुझे अकेले इस प्रीकंपाइल कार्य के लिए प्रत्येक तैनाती के दौरान 1 मिनट या उससे अधिक इंतजार करना पड़ता है। क्या इसे तेज करने का कोई तरीका है?
पहले मैंने css और JS को संपीड़ित/छोटा करने के लिए Jammit का उपयोग किया था। Jammit ने उसी वेब साइट और सर्वर पर लगभग 10 गुना तेजी से काम किया।
3 जवाब
यदि आपको रेल पर्यावरण को लोड करने की आवश्यकता नहीं है, तो आपको इसे इसके साथ अक्षम करना चाहिए:
config.assets.initialize_on_precompile = false
संपादित करें: मैंने अभी इस समस्या को हल करने के लिए एक रत्न लिखा है, जिसे turbo-sprockets-rails3 कहा जाता है। यह आपके assets:precompile
को केवल बदली हुई फ़ाइलों को फिर से संकलित करके, और सभी संपत्तियों को उत्पन्न करने के लिए केवल एक बार संकलित करके गति देता है।
यह बहुत अच्छा होगा यदि आप मुझे turbo-sprockets-rails3 रत्न का परीक्षण करने में मदद कर सकें, और मुझे बताएं कि क्या आपको कोई समस्या है।
एक Rails 3.1.0 में एक बग है जिसमें प्रीकंपाइल प्रक्रिया में बहुत सारी फाइलें शामिल हैं। यदि आपके पास कई संपत्तियां जेएस और सीएसएस संपत्तियां हैं तो यह धीमेपन का कारण हो सकता है।
दूसरा यह है कि स्प्राकेट्स (संकलन करने वाला रत्न) अधिक जटिल है और इसमें अधिक विकल्प - एससीएसएस, कॉफ़ीस्क्रिप्ट और एआरबी की अनुमति है। इस वजह से मुझे संदेह है कि यह केवल संयोजन और खनन करने में धीमा होगा।
जैसा कि सुझाव दिया गया है, यदि यह अभी भी एक समस्या है तो आप उन्हें तैनात करने से पहले फ़ाइलों को प्रीकंपाइल कर सकते हैं।
मेरा समाधान 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
संबंधित सवाल
नए सवाल
ruby-on-rails-3.1
रूबी ऑन रेल्स संस्करण 3.1.0 रूबी ऑन रेल्स का एक विशिष्ट संस्करण है। इसे 30 अगस्त, 2011 को जारी किया गया था। रूबी संस्करण 3.1 में रूबी में विकास से संबंधित मुद्दों के लिए इस टैग का उपयोग करें।
config.assets.initialize_on_precompile = false