2015-04-14 6 views
14

मैं bundle update भाग गया और sprockets से 3.0.0 तक अपडेट किया।कैपिस्ट्रानो 3 + स्प्राकेट्स 3 + रेल 4.2.1 तैनात नहीं होगा?

जब मैं Capistrano 3 के माध्यम से तैनात करने के लिए मैं करने के निम्न त्रुटि कोशिश:

INFO [e54ac5ca] Running /usr/bin/env cp /var/www/testapp/releases/20150414002210/public/assets/manifest* /var/www/testapp/releases/20150414002210/assets_manifest_backup as [email protected] 
DEBUG [e54ac5ca] Command: cd /var/www/testapp/releases/20150414002210 && /usr/bin/env cp /var/www/testapp/releases/20150414002210/public/assets/manifest* /var/www/testapp/releases/20150414002210/assets_manifest_backup 
DEBUG [e54ac5ca] cp: cannot stat ‘/var/www/testapp/releases/20150414002210/public/assets/manifest*’ 
DEBUG [e54ac5ca] : No such file or directory 
DEBUG [d2c5a990] cp: cannot stat ‘/var/www/testapp/releases/20150414002210/public/assets/manifest*’ 
DEBUG [d2c5a990] : No such file or directory 
cap aborted! 
SSHKit::Runner::ExecuteError: Exception while executing as [email protected]: cp exit status: 1 
cp stdout: Nothing written 
cp stderr: cp: cannot stat ‘/var/www/testapp/releases/20150414002210/public/assets/manifest*’: No such file or directory 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/sshkit-1.7.1/lib/sshkit/runners/parallel.rb:16:in `rescue in block (2 levels) in execute' 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/sshkit-1.7.1/lib/sshkit/runners/parallel.rb:12:in `block (2 levels) in execute' 
SSHKit::Command::Failed: cp exit status: 1 
cp stdout: Nothing written 
cp stderr: cp: cannot stat ‘/var/www/testapp/releases/20150414002210/public/assets/manifest*’: No such file or directory 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/sshkit-1.7.1/lib/sshkit/command.rb:95:in `exit_status=' 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/sshkit-1.7.1/lib/sshkit/backends/netssh.rb:179:in `block in _execute' 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/sshkit-1.7.1/lib/sshkit/backends/netssh.rb:133:in `tap' 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/sshkit-1.7.1/lib/sshkit/backends/netssh.rb:133:in `_execute' 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/sshkit-1.7.1/lib/sshkit/backends/netssh.rb:66:in `execute' 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/capistrano-rails-1.1.2/lib/capistrano/tasks/assets.rake:68:in `block (5 levels) in <top (required)>' 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/sshkit-1.7.1/lib/sshkit/backends/abstract.rb:77:in `within' 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/capistrano-rails-1.1.2/lib/capistrano/tasks/assets.rake:67:in `block (4 levels) in <top (required)>' 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/sshkit-1.7.1/lib/sshkit/backends/netssh.rb:54:in `instance_exec' 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/sshkit-1.7.1/lib/sshkit/backends/netssh.rb:54:in `run' 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/sshkit-1.7.1/lib/sshkit/runners/parallel.rb:13:in `block (2 levels) in execute' 
Tasks: TOP => deploy:assets:backup_manifest 
(See full trace by running task with --trace) 
The deploy has failed with an error: #<SSHKit::Runner::ExecuteError: Exception while executing as [email protected]: cp exit status: 1 
cp stdout: Nothing written 
cp stderr: cp: cannot stat ‘/var/www/testapp/releases/20150414002210/public/assets/manifest*’: No such file or directory 

मैं संभवतः यही समस्याएं आ रही लोगों के लिए चारों ओर देखा है और ऐसा लगता है कि उनमें कोई समस्या या उस पर टिप्पणी नहीं कर रहे हैं कहीं भी ...

ईमानदारी से मुझे यह भी सुनिश्चित नहीं है कि sprockets, sprockets-rails रेल से संबंधित हैं। यह मेरे लिए काफी उलझन में है ... उदाहरण के लिए, जो ताजा Rails 4.2.1 ऐप के साथ आता है, कहते हैं कि Gemfile.lock में स्पॉकेट्स 3.0.0 की अनुमति है, फिर भी जब आप स्पॉकेट 2-> 3 अपग्रेड गाइड पर जाते हैं, तो यह दिखाता है कि //= include हटा दिया गया है, फिर भी यह application.js फ़ाइल में ठीक है।

तो, शायद मुझे कुछ याद आ रहा है, लेकिन मुझे पूरा यकीन नहीं है कि इसे कैसे हल किया जाए।

उत्तर

7

समस्या को ठीक करना आसान है, लेकिन मुझे लगता है कि पहले हमें कुछ अन्य प्रश्नों को संबोधित करना चाहिए।

sprockets एक रूबी लाइब्रेरी है जो वेब फ्रंट एंड एसेट्स (सीएसएस, जेएस, इमेज इत्यादि) प्रबंधित करने को स्वचालित करती है।

यह तार्किक विकास में का आयोजन किया है, और फिर श्रृंखला के लिए और उत्पादन के लिए लागू करने से पहले कम करें उन्हें अपने परिसंपत्ति फ़ाइलें रखने के विचार पर आधारित है। स्प्राकेट्स इस प्रक्रिया को स्वचालित बनाता है।

रेल 3.1 (बहुत समय पहले, अब) ने "एसेट पाइपलाइन" नामक एक नई सुविधा जारी की, जो वेब परिसंपत्तियों के प्रबंधन को स्वचालित करती है। रेल की संपत्ति पाइपलाइन थी, और अभी भी sprockets द्वारा संचालित है।

sprockets और rails दोनों सक्रिय रूप से बनाए रखा और विकसित पुस्तकालय हैं। नए संस्करण नई सुविधाओं और ब्रेकिंग परिवर्तनों के साथ जारी किए जाते हैं।
मेरा मानना ​​है कि रेल डिफ़ॉल्ट रूप से sprockets का नवीनतम संस्करण उपयोग नहीं करते हैं। यह ठीक है, हम यहां सीएसएस और जेएस संकलन के बारे में बात कर रहे हैं, कुछ बाहरी एपीआई के साथ बातचीत नहीं कर रहे हैं; sprockets का पुराना संस्करण भी काम कर सकता है।
इसका मतलब है कि sprockets अद्यतन करना एक अच्छा विचार नहीं है। रेल के प्रत्येक संस्करण के लिए एक विशिष्ट (न्यूनतम-अधिकतम) sprockets के संस्करण, अच्छे कारण के लिए घोषित करती है: यह संस्करण है कि वर्तमान एसेट पाइपलाइन पर निर्भर करता है है। इसे अपडेट करना चीजों को तोड़ सकता है।

फिर, आइए मैनिफेस्ट फ़ाइल पर जाएं।
डिफ़ॉल्ट रूप से, प्रीकंपलिंग के बाद संपत्ति (संदर्भों को हल करना, दूसरों में कुछ फ़ाइलों सहित, चेनिंग और उन्हें छोटा करना), संकलित संपत्तियों को RAILS_ROOT/public/assets में कॉपी किया गया है। उनके साथ, रेल manifest फ़ाइल उत्पन्न करता है जिसमें सभी प्रीकंपील्ड संपत्तियों की एक सूची होती है। रेल के आपके संस्करण में यह manifest.json होना चाहिए, लेकिन यह manifest.yml होता था।

अब, पहेली के अंतिम टुकड़ा capistrano है, जो मुझे लगता है कि आप जानते हैं कि कैसे उपयोग करने के लिए।

लाइन:

cp: cannot stat ‘/var/www/testapp/releases/20150414002210/public/assets/manifest*’ 

मतलब यह है कि capistrano अपने RAILS_ROOT/public/assets निर्देशिका में manifest फ़ाइल खोजने की कोशिश की। वाइल्डकार्ड वहां है क्योंकि रेल के संस्करण के आधार पर यह manifest.json या manifest.yml हो सकता है।
इसके अलावा, stat का अर्थ है कि capistrano फ़ाइल से कुछ जानकारी प्राप्त करने का प्रयास कर रहा है, शायद यह पता लगाने के लिए कि यह कितना हालिया है।

समस्या यह है कि फ़ाइल मौजूद नहीं है।
आपको precompile the assets होना चाहिए, फिर जेनरेट की गई फ़ाइलें प्रतिबद्ध करें और फिर से तैनात करने का प्रयास करें।

+11

उन्नयन Capistrano-रेल द्वारा इस तय वास्तव में आप स्थानीय स्तर पर संपत्ति precompile और बाद में भंडार करने के लिए उन्हें प्रतिबद्ध करने के लिए जरूरत नहीं है। यह एक बग है, और कैपिस्ट्रानो-रेल लोग अभी इस पर काम कर रहे हैं: https://github.com/capistrano/rails/pull/112 और https://github.com/capistrano/rails/issues/111 वैसे भी , इस तरह के विस्तृत उत्तर के लिए अंगूठे! –

+1

ओह, अच्छी जानकारी, धन्यवाद। कैपिस्ट्रानो के साथ तैनाती करते समय, मैं हमेशा एक तैनाती रणनीति पसंद करता हूं जो _deploy branch_ का उपयोग करता है, ताकि "संकलित संपत्तियां" आपके _master_ को प्रदूषित न करें। इसके अलावा, अधिकतर आप सर्वर के क्लस्टर पर तैनात नहीं होंगे, और मुझे आपके द्वारा तैनात प्रत्येक सर्वर पर उन्हें बार-बार संकलित करने में अक्षमता मिलती है। साथ ही, उन्हें स्थानीय रूप से प्रीकंपलिंग करना सीडीएन में अपलोड करने के लिए स्वचालित (कैप तैनाती कार्य के भीतर) स्वचालित करना आसान बनाता है। – tompave

+4

@mid से टिप्पणी पर विस्तार करने के लिए, क्या हुआ यह है कि स्पॉकेट 3.0.0 [एक बदलाव प्रस्तुत किया गया] [https://github.com/rails/sprockets/commit/ce6508e8540f829c6221afa39fdf718e4dded096) जहां इसे manifest.json से मेनिफेस्ट फ़ाइल का नाम दिया गया to .sprockets-manifest.json। हम दोनों फाइल नामों की जांच करने के लिए कैपिस्ट्रानो-रेल को अद्यतन करने की प्रक्रिया में हैं और जो भी इसे पाता है उसका उपयोग करें। –

22

यदि आप capistrano-rails का उपयोग कर रहे हैं, तो 1.1.3 पर अपडेट करने का प्रयास करें। इसने मेरे लिए मुद्दा तय कर दिया है।

capistrano-rails CHANGELOG:

1.1.3 (Apr 18 2015) 
- Fixed no_release behaviour (https://github.com/capistrano/rails/pull/95) 
- Allow assets manifest backup with folder "manifests" (https://github.com/capistrano/rails/pull/92) 
- Handle Sprocket 3 manifest filename 
+3

आपको बहुत बहुत धन्यवाद !!! मेरे जैसे अन्य डमीज़ के लिए - जेम्फाइल सेट संस्करण में सीधे मणि 'कैपिस्ट्रानो-रेल', '~> 1.1.3' – kpblc

4
टिप्पणी प्रति

, मैं से 1.1.2 -> 1.1.3

# Gemfile 
'capistrano-rails', '~> 1.1.3'