बंडल निष्पादन रेक का क्या अर्थ है?


351

क्या bundle exec rake db:migrateमतलब है? या सिर्फ bundle exec rake <command>सामान्य तौर पर?

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

जवाबों:


468

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

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

"क्यों?" मैं बंडल पेज से उद्धृत करूंगा :

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

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


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

11
@ एडमंड ए "बंडल" एक अंग्रेजी शब्द है, जिसका अर्थ समान चीजों का एक समूह है, जो आमतौर पर बड़े करीने से बंधा होता है। विशेष रूप से इस प्रश्न में, यह रत्नों के एक समूह को संदर्भित करता है (स्व-निहित रूबी कोड लाइब्रेरी।) बुंडलर उस सॉफ़्टवेयर का नाम है जिसे हम रत्न का प्रबंधन करने के लिए यहां उपयोग कर रहे हैं। और bundleआज्ञा है जो बुंदलर द्वारा उपयोग की जाती है।
घोप्पे

2
मुझे लगता है कि जब भी हम Gemfile के साथ एक फ़ोल्डर में cd करते हैं, शेल स्वचालित रूप से Gemfile (उदाहरण के लिए रूबी संस्करण) में निर्दिष्ट संस्करणों का उपयोग करेगा। उस धारणा के आधार पर, मुझे लगा कि रेक डीबी: माइग्रेट हमेशा बंडल निष्पादन के बिना ठीक चलेगा। CMIIW
Pahlevi Fikri औलिया

1
@PahleviFikriAuliya केवल तभी सही है जब आपके पास .ruby-gemsetअपने प्रोजेक्ट रूट में एक फ़ाइल हो। .ruby-versionआरवीएम का उपयोग करने पर एक फ़ाइल भी है जो आपके रूबी संस्करण को सेट करती है।
कैटफ़िश

1
लिंक किए गए पृष्ठ में आपके द्वारा निर्दिष्ट उद्धरण का उल्लेख नहीं है। कृपया ठीक करें, धन्यवाद।
गौरांग टंडन

153

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

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

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

पर अधिक देखें आदमी पेज

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

source 'http://rubygems.org'

gem 'rails', '2.8.3'

यहाँ, bundle execरेल के संस्करण २. would.३ का उपयोग कर स्क्रिप्ट निष्पादित करेंगे और कुछ अन्य संस्करण जो आपने सिस्टम-वाइड स्थापित किए होंगे।


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

1
इसलिए इस उदाहरण को जोड़ने के लिए: यदि व्यक्ति बस rake db:migrateबाहर निकलता है bundle execतो यह एक सिस्टमफाइड जेमफाइल का उपयोग करके निष्पादित करेगा जहां किसी पर 1.5.2 (नवीनतम) रैक हो सकता है?
स्मोकिन जो

बहुत बेहतर जवाब, ठोस उदाहरणों के साथ।
अहानिबेकाड

2
तो bundle exec"ऐप-विशिष्ट", आपके ऐप के जेमफाइल में स्थानीय रत्न का bundleउपयोग करता है , और यदि आपने किया तो "मशीन-विशिष्ट", वैश्विक रत्नों का उपयोग करता है gem install a_certain_gem। स्थानीय बनाम वैश्विक
एहनबेकद

चुने हुए से बेहतर उत्तर।
बून

9

यह बहुत ऊपर आता है जब आपके मणिफाइल.लॉक में आपके मशीन पर स्थापित रत्नों के विभिन्न संस्करण होते हैं। आपको रेक (या rspec या अन्य) चलाने के बाद चेतावनी मिल सकती है जैसे:

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संस्करण अंतर की परवाह किए बिना बंडल को इस कमांड को निष्पादित करने के लिए कहता है। वहाँ हमेशा एक समस्या नहीं है, हालांकि, आप समस्याओं में भाग सकते हैं।

सौभाग्य से, एक मणि है जो इसे हल करता है: रूबीज-बंडलर।

$ gem install rubygems-bundler

$ $ gem regenerate_binstubs

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


2020 में अभी भी एक महान समाधान है।
Brateq

6

यह संभवतः उल्लेख किया जाना चाहिए, कि छोड़ने के तरीके हैं bundle exec(वे सभी माइकल हार्ट्स रूबी के अध्याय 3.6.1 में रेल ट्यूटोरियल बुक में वर्णित हैं )।

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

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

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

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

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

$ gem install rubygems-bundler
$ gem regenerate_binstubs

1

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

वांछित मणि संस्करण को लागू करने के लिए आप bundle execकमांड की सहायता लेते हैं जो वर्तमान बंडल के संदर्भ में बाइनरी को निष्पादित करेगा। इसका मतलब है कि जब आप बंडल निष्पादन का उपयोग करते हैं, तो बंडलर चालू परियोजना के लिए कॉन्फ़िगर किए गए मणि संस्करण की जांच करता है और कार्य करने के लिए उपयोग करता है।

मैंने भी लिखा है a बारे में पोस्टजिसमें यह भी दिखाया गया है कि कैसे हम बिन स्टब्स के इस्तेमाल से इससे बच सकते हैं।


1

मैंने उपयोग नहीं किया है bundle exec ज्यादा है, लेकिन अभी इसे स्थापित कर ।

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

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

https://thoughtbot.com/blog/use-bundlers-binstubs


0

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

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