2011-07-05 21 views
299

bundle exec rake db:migrate का क्या अर्थ है? या सामान्य में bundle exec rake <command>?बंडल निष्पादन रेक का क्या अर्थ है?

मुझे लगता है कि bundle जेमफाइल में चीजों को बनाए रखने का ख्याल रखता है। मुझे पता है कि "exec" शब्द का अर्थ क्या है। मैं समझता हूं कि rake उन सभी अलग-अलग लिपि चीजों को बनाए रखता है जो आप कर सकते हैं, और मुझे पता है कि db:migrate उनमें से एक है। मुझे नहीं पता कि ये सभी शब्द एकसाथ क्या कर रहे हैं। डेटाबेस माइग्रेट निष्पादित करने के लिए rake निष्पादित करने के लिए bundle क्यों उपयोग किया जाना चाहिए?

उत्तर

406

bundle exec वर्तमान बंडल के संदर्भ में एक स्क्रिप्ट निष्पादित करने के लिए Bundler कमांड है (आपकी निर्देशिका के Gemfile में से एक)। rake db:migrate वह स्क्रिप्ट है जहां डीबी नामस्थान है और माइग्रेट कार्य नाम परिभाषित किया गया है।

तो bundle exec rake db:migrate वर्तमान बंडल के संदर्भ में db:migrate कमांड के साथ रेक स्क्रिप्ट निष्पादित करता है।

"क्यों?" के रूप में कुछ मामलों में

, bundle exec बिना निष्पादनयोग्य चल रहा काम कर सकते हैं, निष्पादन योग्य आपके सिस्टम में स्थापित होने के लिए होता है और किसी भी जवाहरात कि अपने बंडल के साथ संघर्ष में खींच नहीं करता है, तो: मैं bundler page से बोली जाएगा।

हालांकि, यह अविश्वसनीय है और काफी दर्द का स्रोत है। यहां तक ​​कि अगर ऐसा लगता है कि यह काम करता है, तो यह भविष्य में या किसी अन्य मशीन पर काम नहीं कर सकता है।

+3

धन्यवाद, बहुत शैक्षिक। – JnBrymn

+0

सबसे अच्छा स्पष्टीकरण क्या बंडल निष्पादन का मतलब है। धन्यवाद। – rmagnum2002

+7

क्या इसका मतलब है कि हमें हमेशा बंडल निष्पादन चलाया जाना चाहिए, मैंने रेल पर रूबी और रूबी स्थापित करने के लिए रूबी संस्करण प्रबंधक का उपयोग किया है। –

0

इसका मतलब है कि बंडलर के बारे में पता है और किसी भी रेक पर आपके जेमफाइल का हिस्सा है जो बंडलर को डीबी चलाने और चलाने के लिए नहीं है: माइग्रेट कार्य।

1

मैंने बंडल निष्पादन का अधिक उपयोग नहीं किया है, लेकिन अब इसे स्थापित कर रहा हूं।

मेरे पास ऐसे उदाहरण हैं जहां गलत रेक का उपयोग किया गया था और समस्या को ट्रैक करने में काफी समय बर्बाद हो गया था। यह आपको इससे बचने में मदद करता है।

यहाँ तो आप एक विशेष परियोजना निर्देशिका के भीतर डिफ़ॉल्ट रूप से बंडल कार्यकारी कैसे उपयोग कर सकते rvm स्थापित करने के लिए है:

http://robots.thoughtbot.com/post/15346721484/use-bundlers-binstubs

125

आप एक कार्यक्रम पर bundle exec चला रहे हैं। कार्यक्रम के रचनाकारों ने इसे लिखा जब रत्न के कुछ संस्करण उपलब्ध थे। कार्यक्रम Gemfile रचनाकारों का उपयोग करने का फैसला किया रत्नों के संस्करण निर्दिष्ट करता है। यही है, स्क्रिप्ट इन मणि संस्करणों के खिलाफ सही ढंग से चलाने के लिए बनाई गई थी।

आपका सिस्टम-व्यापी जेमफ़ाइल इस Gemfile से भिन्न हो सकता है। आपके पास नए या पुराने रत्न हो सकते हैं जिसके साथ यह स्क्रिप्ट अच्छा नहीं खेलती है। संस्करणों में यह अंतर आपको अजीब त्रुटियां दे सकता है।

Bundle exec इन त्रुटियों से बचने में आपकी सहायता करता है। यह सिस्टमव्यापी जेमफाइल की बजाय स्क्रिप्ट के जेमफाइल में निर्दिष्ट रत्नों का उपयोग करके स्क्रिप्ट निष्पादित करता है। यह शेल उपनाम के जादू के साथ कुछ मणि संस्करण निष्पादित करता है।

the man page पर और देखें।

यहाँ एक उदाहरण Gemfile है:

source 'http://rubygems.org' 

gem 'rails', '2.8.3' 

यहाँ, bundle exec रेल संस्करण 2.8.3 का उपयोग कर स्क्रिप्ट को निष्पादित होगा और न किसी अन्य संस्करण आप पूरे सिस्टम पर स्थापित हो सकता है।

+9

मुझे यह उत्तर ओपी द्वारा चुने गए से बेहतर पसंद है: डी! अधिक स्पष्ट है। – lemavri

+1

तो इस उदाहरण में जोड़ने के लिए: यदि व्यक्ति को बस 'भाग गया रेक db: migrate' बंडल exec' बाहर छोड़ने' तो यह 1.5.2 पर एक प्रणाली का उपयोग करते हुए Gemfile पर अमल होगा, जहां एक रैक हो सकता है (नवीनतम)? –

+0

सबसे अच्छा और सबसे सरल समझने योग्य स्पष्टीकरण। कंक्रीट उदाहरणों के साथ – JVK

6

यह शायद उल्लेख किया जाना चाहिए कि bundle exec को छोड़ने के तरीके हैं (वे सभी माइकल हार्टल्स Ruby on Rails Tutorial पुस्तक के अध्याय 3.6.1 में बताए गए हैं)।

सबसे आसान है केवल आरवीएम (> = 1.11.एक्स) के पर्याप्त रूप से अद्यतित संस्करण का उपयोग करना।

आप RVM के पिछले संस्करण के लिए प्रतिबंधित कर रहे हैं, आप हमेशा इस विधि को भी calasyr ने उल्लेख उपयोग कर सकते हैं:

$ rvm get head && rvm reload 
$ chmod +x $rvm_path/hooks/after_cd_bundler 
$ bundle install --binstubs=./bundler_stubs 

bundler_stubs निर्देशिका तो भी .gitignore फाइल करने के लिए जोड़ा जाना चाहिए।

$ gem install rubygems-bundler 
$ gem regenerate_binstubs 
7

यह एक बहुत ऊपर आता है जब अपने gemfile.lock जवाहरात अपने मशीन पर स्थापित के विभिन्न संस्करणों है:

एक तीसरा विकल्प यदि आप RVM उपयोग नहीं कर रहे rubygems-bundler मणि का प्रयोग है।

You have already activated rake 10.3.1, but your Gemfile requires rake 10.1.0. Prepending "bundle exec" to your command may solve this.

prepending bundle exec बंडलर बताता संस्करण अंतर की परवाह किए बिना इस आदेश पर अमल करने: आप इस तरह के रूप रेक (या rspec या अन्य) चलाने के बाद एक चेतावनी मिल सकता है। हमेशा कोई मुद्दा नहीं है, हालांकि, आप समस्याओं में भाग ले सकते हैं।

सौभाग्य से, एक मणि है जो इसे हल करता है: rubygems-bundler।

$ gem install rubygems-bundler

$ $ gem regenerate_binstubs

फिर अपने रेक, rspec, या जो कुछ भी प्रयास करें।

+0

एक्सेलेंट! हल किया – mariowise

संबंधित मुद्दे