RVM और rbenv वास्तव में कैसे काम करते हैं?


140

मुझे इस बात में दिलचस्पी है कि आरवीएम और रेंब वास्तव में कैसे काम करते हैं।

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

जवाबों:


241

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

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

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

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

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

प्रत्येक शिम एक छोटी बैश स्क्रिप्ट है जो बदले में चलती है rbenv exec। तो आपके मार्ग में रेंबव के साथ, irbके बराबर है rbenv 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 मान लेता है कि आप "सिस्टम" रूबी का उपयोग करना चाहते हैं - यानी अगर rbenv आपके रास्ते में नहीं थे, तो जो भी संस्करण चलाया जाएगा।

(आप rbenv localकमांड के साथ एक परियोजना-विशिष्ट रूबी संस्करण सेट कर सकते हैं , जो .rbenv-versionवर्तमान निर्देशिका में एक फ़ाइल बनाता है । इसी तरह, फ़ाइल को निर्दिष्ट rbenv globalकरता है ~/.rbenv/version।)

एक RBENV_VERSIONपर्यावरण चर के साथ सशस्त्र , rbenv ~/.rbenv/versions/$RBENV_VERSION/binआपके सामने जोड़ता है PATH, फिर कमांड और तर्कों को निष्पादित करता है rbenv exec। देखा!

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


अब, रेंबव केवल स्विचिंग संस्करणों के साथ संबंध रखता है, लेकिन प्लगइन्स का एक संपन्न पारिस्थितिकी तंत्र आपको रूबी को स्थापित करने से लेकर आपके पर्यावरण को स्थापित करने , "जवाहरात" और यहां तक ​​कि स्वचालित bundle execकरने तक सब कुछ करने में मदद करेगा

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

प्रकटीकरण: मैं rbenv, रूबी-बिल्ड, और rbenv-var का लेखक हूं।


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

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

अरे, सैम, क्योंकि यह उत्तर दो साल पुराना है, क्या आप कोई अपडेट करना चाहेंगे? निश्चित रूप से उस समय के बाद से rbenv में कुछ बदल दिया गया है।
नैकिलोन

नहीं। सर्वश्रेष्ठ हैकर का वर्णन मैंने कभी देखा है। मुझे लगता है कि एकमात्र अपडेट जिसे वहां बदलने की जरूरत है, वह रेंबव-जेनेट से लिंक है (लिंक अभी भी आपको वहां मिलेगा। यह एक पुनर्निर्देशन से सिर्फ एक अतिरिक्त कदम है)।
जेफरी 'जेएफ' लिम

18

मैंने एक गहन लेख लिखा: http://niczsoft.com/2011/11/what-you-should-know-about-rbenv-and-rvm/

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

  • RVM: जब आप रूबी बदलते हैं तो यह बदल जाता है।
  • rbenv: जब आप Ruby / gem निष्पादन योग्य चलाते हैं तो यह बदल जाता है।

इसके अलावा, RVM के बारे में बात यह है कि यह बहुत अधिक कवर करता है, बस Rubies का प्रबंधन करता है, इसमें किसी भी अन्य टूल की तुलना में बहुत अधिक है (RVM और rbenv के अलावा अन्य हैं: https://twitter.com/#//mpapis/ स्थिति / 171714447910502401 )

Freenode सर्वर पर "#rvm" चैनल में IRC पर मिलने वाले तुरंत समर्थन के बारे में मत भूलना।


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

15

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

rbenv:

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

RVM:

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

अन्य अंतर:

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


6

मुख्य अंतर यह प्रतीत होता है कि कब और कैसे रूबी को स्विच किया जाता है । रूबी बंद है:

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

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

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


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/jruby-1.6.6@global
*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/jruby-1.6.6@global/bin

सेवा $PATH

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