2012-02-22 79 views
131

मुझे रूचि है कि आरवीएम और आरबीएनवी वास्तव में कैसे काम करते हैं।आरवीएम और आरबीएनवी वास्तव में कैसे काम करते हैं?

स्पष्ट रूप से वे रूबी और रत्नों के विभिन्न संस्करणों के बीच स्वैप करते हैं, लेकिन यह कैसे प्राप्त किया जाता है? मैंने माना था कि वे सिमलिंक को अपडेट कर रहे थे, लेकिन कोड में पहुंचे (और मुझे बैश के बारे में मेरा ज्ञान स्वीकार करना होगा) वे इस से अधिक कर रहे हैं।

उत्तर

225

लघु स्पष्टीकरण: rbenv आपके पर्यावरण के PATH में हुक करके काम करता है। अवधारणा सरल है, लेकिन शैतान विवरण में है; नीचे पूरा स्कूप।

पहले, rbenv सभी आदेश (ruby, irb, rake, gem और इसी तरह) रूबी के अपने सभी स्थापित संस्करणों में के लिए शिम्स पैदा करता है। इस प्रक्रिया को rehashing कहा जाता है। हर बार जब आप रूबी का एक नया संस्करण स्थापित करते हैं या एक कमांड प्रदान करते हुए एक मणि इंस्टॉल करते हैं, तो यह सुनिश्चित करने के लिए कि कोई भी नया आदेश shimmed है, rbenv rehash चलाएं।

ये शिम्स एक ही निर्देशिका में रहते हैं (डिफ़ॉल्ट रूप से ~/.rbenv/shims)। rbenv का उपयोग करने के लिए, आप की जरूरत ही की परतें निर्देशिका अपने PATH के सामने से जोड़ें:

export PATH="$HOME/.rbenv/shims:$PATH" 

तो किसी भी समय आप कमांड लाइन से ruby चलाते हैं, या एक स्क्रिप्ट जिसका मामला पढ़ता #!/usr/bin/env ruby चलाने के लिए, अपने ऑपरेटिंग सिस्टम मिलेगा ~/.rbenv/shims/ruby पहले और किसी अन्य ruby निष्पादन योग्य के बजाय इसे चलाएं, जिसे आपने इंस्टॉल किया हो।

प्रत्येक शिम एक छोटी बैश स्क्रिप्ट है जो बदले में rbenv exec चलाती है। तो आपके पथ में rbenv के साथ, irbrbenv exec irb के बराबर है, और ruby -e "puts 42"rbenv exec ruby -e "puts 42" के बराबर है।

rbenv exec कमांड यह बताता है कि रूबी का कौन सा संस्करण आप उपयोग करना चाहते हैं, फिर उस संस्करण के लिए संबंधित कमांड चलाता है। यहां बताया गया है:

  1. यदि RBENV_VERSION पर्यावरण चर सेट किया गया है, तो इसका मूल्य उपयोग के लिए रूबी के संस्करण को निर्धारित करता है।
  2. यदि वर्तमान कार्य निर्देशिका में .rbenv-version फ़ाइल है, तो इसकी सामग्री RBENV_VERSION पर्यावरण चर सेट करने के लिए उपयोग की जाती है।
  3. यदि वर्तमान निर्देशिका में .rbenv-version फ़ाइल नहीं है, तो rbenv .rbenv-version फ़ाइल के लिए प्रत्येक मूल निर्देशिका को तब तक खोजता है जब तक कि यह आपके फाइल सिस्टम की जड़ को हिट नहीं करता। यदि कोई पाया जाता है, तो इसकी सामग्री RBENV_VERSION पर्यावरण चर सेट करने के लिए उपयोग की जाती है।
  4. यदि RBENV_VERSION अभी भी सेट नहीं है, तो rbenv ~/.rbenv/version फ़ाइल की सामग्री का उपयोग करके इसे सेट करने का प्रयास करता है।
  5. यदि कोई संस्करण कहीं भी निर्दिष्ट नहीं है, तो rbenv मानता है कि आप "सिस्टम" रूबी-i.e का उपयोग करना चाहते हैं। यदि आपके पथ में आरबीएनवी नहीं थे तो जो भी संस्करण चलाया जाएगा।

एक RBENV_VERSION साथ

सशस्त्र (आप rbenv local आदेश है, जो वर्तमान निर्देशिका में एक .rbenv-version फ़ाइल बनाता है के साथ एक परियोजना विशेष रूबी संस्करण सेट कर सकते हैं। इसी तरह, rbenv global आदेश को संशोधित करता ~/.rbenv/version फ़ाइल।) पर्यावरण चर, rbenv ~/.rbenv/versions/$RBENV_VERSION/bin को आपके PATH के सामने जोड़ता है, फिर rbenv exec पर दिए गए आदेश और तर्क निष्पादित करता है। देखा!

हुड के नीचे क्या होता है, इसकी पूरी तरह से देखने के लिए, RBENV_DEBUG=1 सेट करने और रूबी कमांड चलाने का प्रयास करें। प्रत्येक बैश कमांड जो rbenv रन आपके टर्मिनल पर लिखा जाएगा।


अब, rbenv बस स्विचिंग संस्करणों के साथ संबंध है, लेकिन प्लग इन की एक संपन्न पारिस्थितिकी तंत्र आप installing Ruby से setting up your environment, managing "gemsets" और यहां तक ​​कि automating bundle exec लिए सब कुछ करने के लिए मदद मिलेगी।

मुझे यकीन नहीं है कि रूबी संस्करणों को स्विच करने के साथ आईआरसी समर्थन क्या करना है, और आरबीएनवी को सरल और समझने योग्य बनाया गया है ताकि समर्थन की आवश्यकता न हो। लेकिन क्या आपको कभी मदद की ज़रूरत है, इश्यू ट्रैकर और ट्विटर सिर्फ दो क्लिक दूर हैं।

प्रकटीकरण: मैं आरबीएनवी, रूबी-बिल्ड, और आरबीएनवी-वर्र्स का लेखक हूं।

+13

इस तरह के एक उत्कृष्ट जवाब देने के लिए समय लेने के लिए धन्यवाद। – superluminary

+2

वाह, इस तरह के एक समझदार और समझने योग्य स्पष्टीकरण के लिए धन्यवाद। एक प्राकृतिक जन्म शिक्षक। – racl101

+2

लगता है। रूबी-संस्करण भी चाल करेगा। – alexzg

5
rvm system 
env > before 
rvm jruby # or whatever 
env > after 
diff after before 

आप लगभग देता है:

< GEM_HOME=$HOME/.gem/ruby/1.9.1 
--- 
> GEM_HOME=$HOME/.rvm/gems/jruby-1.6.6 
< GEM_PATH=$HOME/.gem/ruby/1.9.1 
--- 
> GEM_PATH=$HOME/.rvm/gems/jruby-1.6.6:$HOME/.rvm/gems/[email protected] 
*bunch of rvm_* 
> MY_RUBY_HOME=$HOME/.rvm/rubies/jruby-1.6.6 
> RUBY_VERSION=jruby-1.6.6 
> IRBRC=$HOME/.rvm/rubies/jruby-1.6.6/.irbrc 

और यह पहले जोड़ता:

$HOME/.rvm/gems/jruby-1.6.6/bin:$HOME/.rvm/gems/[email protected]/bin 

$PATH को

18

मैं बारे में गहराई से लेख लिखा था: http://niczsoft.com/2011/11/what-you-should-know-about-rbenv-and-rvm/

मूल अंतर यह है कि शैल पर्यावरण बदल गया है:

  • आरवीएम: जब आप रुबी बदलते हैं तो यह बदल जाता है।
  • rbenv: जब आप रुबी/मणि निष्पादन योग्य चलाते हैं तो यह बदल जाता है।

    है:

इसके अलावा, चीज़ के बारे में RVM है, यह एक बहुत अधिक तो सिर्फ प्रबंध माणिक को शामिल किया गया है, यह किसी भी अन्य उपकरण तुलना में बहुत अधिक है (https://twitter.com/#!/mpapis/status/171714447910502401 वहाँ दूसरों के अलावा RVM और rbenv से कर रहे हैं) फ्रीनोड सर्वर पर "# आरवीएम" चैनल में आईआरसी पर तत्काल समर्थन के बारे में न भूलें।

+1

धन्यवाद, यह वास्तव में बहुत अच्छा है कि दोनों समुदायों के लोग शामिल हो रहे हैं। – superluminary

13

तो ऊपर दिए गए उत्कृष्ट उत्तरों को सारांशित करने के लिए, आरवीएम और आरबीएनवी के बीच मुख्य व्यावहारिक अंतर तब होता है जब रूबी का संस्करण चुना जाता है।

rbenv:

rbenv अपने पथ, रूबी के रूप में एक ही नाम के साथ एक कमांड के शुरू करने के एक परत कहते हैं। जब आप कमांड लाइन पर ruby टाइप करते हैं तो इसके बजाय शिम चलाया जाता है (क्योंकि इसे "रूबी" भी कहा जाता है और पथ में पहले आता है)। शिम एक पर्यावरण चर या .rbenv_version फ़ाइल के लिए दिखता है यह बताने के लिए कि रूबी का कौन सा संस्करण प्रतिनिधि है।

RVM:

RVM आप सीधे rvm use फोन करके रूबी का एक संस्करण स्थापित करने के लिए अनुमति देता है। इसके अलावा, यह cd सिस्टम कमांड को ओवरराइड करता है। जब आप cd को उस फ़ोल्डर में डालते हैं जिसमें .rvmrc फ़ाइल है, तो .rvmrc फ़ाइल के अंदर कोड निष्पादित किया गया है। इसका उपयोग रुबी संस्करण, या आपके द्वारा कल्पना की जाने वाली किसी अन्य चीज़ को सेट करने के लिए किया जा सकता है।

अन्य मतभेद:

वहाँ के पाठ्यक्रम अन्य मतभेद हैं। आरवीएम में बॉक्स से बाहर रत्न हैं, जबकि आरबीएनवीवी को थोड़ा और हैकिंग की आवश्यकता है (लेकिन ज्यादा नहीं)। दोनों समस्या के कार्यात्मक समाधान हैं।

5

मुख्य अंतर when and how ruby is switched लगता है। रूबी चालू किया जाये:

    RVM मैन्युअल रूप से (rvm उपयोग) के लिए
  • या स्वचालित रूप से निर्देशिका के परिवर्तन के दौरान
  • स्वचालित रूप से rbenv हर बार एक गहरे लाल रंग का आदेश निष्पादित किया जाता है के लिए

RVM संशोधित cd आदेश पर निर्भर करता है और rvm use द्वारा रूबी का मैन्युअल चयन। rbenv रूबी का चयन करने के लिए डिफ़ॉल्ट तंत्र के रूप में सभी बुनियादी रूबी कमांड के लिए रैपर या "shims" का उपयोग करता है। आरवीएम मूल कमांड लाइन टूल्स जैसे मणि, रेक, रूबी, के लिए रैपर बनाता है। उदाहरण के लिए उनका उपयोग क्रोन जॉब्स में किया जाता है (http://rvm.io/integration/cron/ देखें), लेकिन रूबी संस्करण को स्विच करने के लिए वे डिफ़ॉल्ट तंत्र नहीं हैं।

इस प्रकार दोनों विधियां ओवरराइटिंग कमांड और रैपर का उपयोग करके सही "रूबी संस्करण" का चयन करें। आरवीएम सीडी जैसे खोल कमांड ओवरराइड करता है। rbenv रूबी, irb, रेक और मणि जैसे सभी बुनियादी रूबी आदेशों को ओवरराइड करता है।

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

  • कोई संबंधित समस्या नहीं^_^