आपने पहले ही एक्स को सक्रिय कर दिया है, लेकिन आपके जेमफाइल को वाई की आवश्यकता है


128

दौड़ते समय rakeमुझे यह त्रुटि मिलती है:

आपने पहले ही रेक को 0.9.2 सक्रिय कर दिया है, लेकिन आपके जेमफाइल को रेक 0.8.7 की आवश्यकता होती है। बंडल निष्पादन का उपयोग करने पर विचार करें।

bundle exec rakeसिर्फ rakeकाम करने के बजाय का उपयोग करना लगता है, लेकिन क्या इसे ठीक करने का सबसे अच्छा तरीका है?


यह भी है क्या RVM इस तरह के एक महान उपकरण बनाता है । यह आपको इन परियोजनाओं में से प्रत्येक के लिए रत्नों का एक अलग सेट रखने की अनुमति देगा ताकि आपको फिर से इसके बारे में चिंता न करनी पड़े।
rm-rf

जवाबों:


84

का उपयोग करना bundle exec है यह करने के लिए सही तरीके से।

मूल रूप से यह हो रहा है कि आपने रेक को 0.9.2 पर अपडेट किया है जो अब आपके जेमफाइल में निर्दिष्ट संस्करण के साथ संघर्ष करता है। इससे पहले आप का नवीनतम संस्करण rakeआपके जेमफाइल में संस्करण से मेल खाता था, इसलिए आपको बस उपयोग करते समय कोई चेतावनी नहीं मिली rake

येहुदा काट्ज़ (मूल बुंडलर डेवलपर्स में से एक) इस ब्लॉग पोस्ट में यह सब बताते हैं ।

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

$ type bake
bake is a function
bake () 
{ 
    bundle exec rake "$@"
}

5
ब्लॉग पोस्ट वास्तव में ज्यादा नहीं समझाता है। असली सवाल यह है कि कुंवारी रूबी को सही निर्भरता क्यों नहीं मिलती और फिर गलत लोगों के होने की शिकायत क्यों ?
ओथियस

64

यदि आपके पास रेक का वर्तमान संस्करण (या जो भी अन्य समस्या पैदा कर रहा है) रखने का कारण है, तो मैट सही है, ऐसा करने का सबसे अच्छा तरीका दौड़ना है bundle exec। यह आपके द्वारा स्थापित किए गए मणि के नवीनतम संस्करण का उपयोग करने के बजाय अपने Gemfile में निर्दिष्ट संस्करण का उपयोग करता है। (nathan.f77 के नीचे एक अच्छा समाधान है यदि आप bundle execहर बार रेक चलाने के लिए टाइप नहीं करना चाहते हैं )

अन्यथा, यदि रेक को अपडेट नहीं करने का कोई कारण नहीं है, तो आप चला सकते हैं

bundle update rake

यह वास्तव में आपके Gemfile.lock को bundle execहर बार चलाने के बजाय रेक के नवीनतम संस्करण का उपयोग करने के लिए अपडेट करेगा ।

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


पुराने संस्करण को उपयोग किए बिना रखने के लिए कम अनुशंसित तरीका bundle execरेक के नए संस्करणों की स्थापना रद्द करना है।

$ रत्न की स्थापना रेक

स्थापना रद्द करने के लिए रत्न का चयन करें:
 1. रेक-0.8.7
 2. रेक-0.9.2
 3. सभी संस्करण
> २
रेक-0.9.2 की सफलतापूर्वक स्थापना रद्द की गई

यह काम करता है, लेकिन यदि आप कई ऐप के साथ काम कर रहे हैं जो रेक के विभिन्न संस्करणों का उपयोग करते हैं, तो यह एक दर्द हो सकता है क्योंकि आप अपने आप को विभिन्न संस्करणों को स्थापित और अनइंस्टॉल करने के लिए लगातार पाएंगे।


इसने मेरे लिए काम किया। किसी कारण के लिए, केवल एक संस्करण (0.8.7) स्थापित किया गया था। तो पहले मैंने किया gem install rake। फिर gem uninstall rakeऔर 0.9.2 को चुना।
बी सेवन

7
bundle updateउपलब्ध नवीनतम संस्करण के लिए निर्दिष्ट संस्करणों के बिना भी किसी भी रत्न को अद्यतन करेगा। वह नहीं हो सकता है जो आप चाहते हैं। bundle update rakeऔर अधिक शिकार होगा।
एलेक्स नेथ

मुझे public_suffixइसके बजाय एक ही समस्या है rakebundle update public_suffixदुर्भाग्य से चलाने का कोई प्रभाव नहीं है।
दिमित्री ज़ैतसेव


13

पिछली बार जब मेरे साथ ऐसा हुआ था, मैंने अपने सभी रत्नों को अपडेट किया था। मैंने एक किया gem uninstall rakeऔर यह संस्करण विकल्पों को सूचीबद्ध किया। मैंने नया उठाया, और फिर मुझे bundle execअब उपयोग नहीं करना था।

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


8

ऊह! काट्ज लेख उत्कृष्ट है!

मुझे यह समाधान सबसे अच्छा लगता है:

bundle install --binstubs

ताकि आप अब टाइप कर सकें

bin/rake .stuff.

अपने जैसे किसी व्यक्ति के लिए जो 2.3 और 3.0.9 दोनों ऐप को विकसित कर रहा है, इससे मुझे बहुत अच्छा महसूस होता है।


8

bundle exec सही है, लेकिन आप इसे हर बार लिखना नहीं चाहते हैं।

आप इसे अपने .bashrc में डाल सकते हैं:

# Automatically invoke bundler for rake, if necessary.
rake() { if [ -e ./Gemfile.lock ]; then bundle exec rake "$@"; else /usr/bin/env rake "$@"; fi; }

स्पष्ट करने के लिए, .bashrc फ़ाइल संभवतः आपके होम डायरेक्टरी [~ / .bashrc] में स्थित है। हर बार जब आप एक नई टर्मिनल विंडो खोलते हैं तो यह फाइल लोड हो जाती है।
रयान

0

उदाहरण के लिए, हर बार मेकफाइल के साथ इसे टाइप न करने का दूसरा तरीका

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