2012-03-19 8 views
43

टी एल; डॉrbenv: gemsets बिना जीवित

  • gemsets से परेशान मत करो; एक मणि के कई संस्करण एक साथ स्थापित किया जा सकता है।
  • आवश्यक होने पर, $ gem-based-binary _version_ args नोटेशन का उपयोग करके निष्पादित करने के लिए कौन सा संस्करण निर्दिष्ट करें।
  • जब आपके पास संस्करण निर्दिष्ट करने वाला एक Gemfile है तो bundle exec का उपयोग करें।
gem install rails -v 3.2.13 
rails _3.2.13_ new Project2 
cd Project2 
bundle exec rails server 

अद्यतन: 2015-06-04

मैं तीन साल पहले इस सवाल का लिखा था। आंशिक रूप से, यह झूठी धारणा पर आधारित था, और आंशिक रूप से स्थिति तब से बदल गई है। अपने मूल उत्तर के लिए @indirect की प्रशंसा के साथ, मैं उपरोक्त संक्षेप में @ केल्विन के नए (कम अपरिवर्तित) उत्तर पर ध्यान देना चाहता हूं।

मेरी झूठी धारणा: एक समय में एक मणि का केवल एक संस्करण स्थापित किया जा सकता है, इसलिए नामस्थान को अलग करने के लिए रत्नों की आवश्यकता है। सच नहीं। एक मणि के कई संस्करण एक साथ स्थापित किया जा सकता है। सबसे हालिया एक का उपयोग कमांड लाइन से किया जाने पर किया जाएगा, जब तक कि आपके पास संस्करण बाधाओं को निर्दिष्ट करने वाला कोई Gemfile न हो और bundle exec के माध्यम से कमांड को आवेदक दें, या संस्करण को इसके पहले तर्क के रूप में निर्दिष्ट करें।

How can I call an older version of a gem from the commandline? फिर भी देखें: अंडरस्कोर-संस्करण नोटेशन।


मूल प्रश्न:

मैं कई परियोजनाओं रेल के विभिन्न संस्करणों का उपयोग कर चल रहा है। मेरे पास रेल के विशिष्ट संस्करणों का उपयोग करके परियोजनाओं को बनाने और एक-दूसरे से अलग परियोजनाओं को रखने के लिए वर्कफ़्लो (नीचे वर्णित) है। मैं अन्य वर्कफ़्लो के साथ प्रयोग करना चाहता हूं, विशेष रूप से, आरवीएम के बजाय आरबीएनवी का उपयोग करना, लेकिन यह स्पष्ट नहीं है कि ऐसा कैसे करें।

प्रश्न: कई रेल परियोजनाओं का निर्माण, प्रत्येक रेल का एक अलग संस्करण का उपयोग कर, जब rbenv और बंडलर का इस्तेमाल कर रही है, के रूप rbenv-gemset या rvm करने का विरोध के लिए सबसे अच्छा वर्तमान अभ्यास क्या है ?

उपयोग केस: मेरे पास दो रेल परियोजनाएं हैं, जिन्हें प्रोजेक्टए और प्रोजेक्ट बी कहा जाता है। प्रोजेक्टए रेल के एक संस्करण ("रेल्सए") का उपयोग करके विकसित किया गया है, जबकि प्रोजेक्टबी एक अलग संस्करण ("रेल्सबी") का उपयोग करता है। मैं दोनों संस्करणों को स्थापित करने का प्रबंधन कैसे करूं?

गेम्स स्वीकृति: जब मैंने पहली बार रेल विकास के साथ शुरुआत की, तो मैंने RVM का उपयोग किया। रूबी के एकाधिक, समवर्ती इंस्टॉलेशन के समर्थन के अलावा, आरवीएम एकाधिक Named Gem Sets रखने का समर्थन करता है।प्रत्येक परियोजना अपनी स्वतंत्र एक gemset कहा जाता है (जो खुद रेल सहित) जवाहरात का संग्रह है:

rvm gemset create RailsA 
rvm gemset use RailsA 
# RailsA. Note: My question is not version-specific. 
gem install rails --version 3.0 
rails new ProjectA 
cd ProjectA 
rvm --rvmrc use `rvm current` 
vi Gemfile 
bundle install 
cd .. 
## Now do the same for ProjectB 
rvm gemset create RailsB 
rvm gemset use RailsB 
gem install rails --version 3.2 
rails new ProjectB 
cd ProjectB 
rvm --rvmrc use `rvm current` 
vi Gemfile 
bundle install 

नोट: बहुत निर्माण परियोजना फ़ोल्डरों की का उपयोग कर वांछित एक rails new आदेश द्वारा (IMHO) किया जाना चाहिए रेल के संस्करण, क्योंकि कंकाल फाइलें संस्करण से संस्करण में बदलती हैं। बंडलर दृष्टिकोण (शायद मैं इस आधार पर फिर से करना चाहिए?)

: मैं RVM के बजाय rbenv का उपयोग कर के साथ खेल रहा है, लेकिन मैं कार्यप्रवाह के रूप में स्पष्ट रूप से समझ में नहीं आता। README.md में, सैम स्टीफनसन लिखते हैं कि "आरबीएनवी नहीं ... जीमेट्स का प्रबंधन करता है। बंडलर एप्लिकेशन निर्भरताओं को प्रबंधित करने का एक बेहतर तरीका है।" आरवीएम के रत्नों के समान परिणाम प्राप्त करने के लिए एक प्लगइन (rbenv-gemset) है, लेकिन सैम स्पष्ट रूप से इसके बजाय बंडलर का उपयोग करने का पक्ष लेता है। दुर्भाग्यवश, वह इस बात पर विस्तार नहीं करता कि वर्कफ़्लो कैसा दिखता है। यहां तक ​​कि Bundler वेबसाइट स्पष्ट रूप से किसी अन्य प्रोजेक्ट को अलग करने के तरीके के सभी बिंदुओं को स्पष्ट रूप से कनेक्ट नहीं करती है। कई blogsandgists बचाव के लिए आते हैं, निम्नलिखित ~/.bundle/config फ़ाइल सुझाव:

--- 
BUNDLE_PATH: vendor/bundle 

(Btw, मुझे यकीन है कि क्या "---" के बारे में डॉक्स इसके बारे में कोई जिक्र नहीं कर रहा है और ऐसा नहीं नहीं हूँ। एक फर्क नहीं पड़ता है।)

यह प्रभावी ढंग से प्रत्येक रेल परियोजना प्रोजेक्टएक्स/विक्रेता/बंडल/में रत्नों को संग्रहित करता है। वास्तव में, रेलवे स्वयं ही (पुन:) स्थापित हो जाएंगी, जिससे परियोजना bundle install चलाने के बाद, मेरे पूरे पर्यावरण से पूरी तरह से स्वतंत्र हो जाएगी।

लेकिन कमरे में हाथी पहली जगह में रेल परियोजना फ़ोल्डर बनाने के चिकन और अंडे की समस्या है !! RailsA का उपयोग कर प्रोजेक्टए फ़ोल्डर बनाने के लिए, मुझे रेल (और इसकी कई निर्भरताओं) पहले इंस्टॉल करने की आवश्यकता है। लेकिन जब मैं प्रोजेक्टबी बनाना चाहता हूं, तो मुझे रेल्सबी का उपयोग करने के लिए स्विच करना होगा। रत्नों के बिना, मुझे कुछ गंभीर उन्नयन/डाउनग्रेडिंग करना होगा। अछा नहीं लगता।

एक संभावित समाधान यह नहीं है कि मैं रेलवे का कौन सा संस्करण प्रोजेक्टएक्स फ़ोल्डर बनाने के लिए उपयोग करता हूं, इस बारे में चिंता न करें। यदि मैं 3.2 परियोजना बनाने के लिए रेल 3.0 का उपयोग करता हूं, तो मैं मैन्युअल रूप से ऐप/संपत्ति पेड़ बना सकता हूं। लेकिन वह सिर्फ मुझे परेशान करता है। क्या कोई बेहतर तरीका नहीं है?

+2

आपके जैसे लगता है वास्तव में आरवीएम और रत्नों का उपयोग करना चाहते हैं। कोई भी विशेष कारण जिसे आप चुन रहे हैं वह टूल का उपयोग न करें जो आपकी समस्या को सबसे सुंदर तरीके से हल करता है? –

+4

मैं किसी भी विशेष उपकरण के लिए प्रतिबद्ध नहीं हूं (और मैं बिल्कुल "आरवीएम बनाम आरबीएनवी" चर्चा में शामिल नहीं होना चाहता हूं)। मैं आरवीएम से अधिक परिचित हूं और मैं इसका उपयोग करने के लिए वर्कफ़्लो समझता हूं। मैं rbenv के लिए समकक्ष वर्कफ़्लो को समझना चाहता हूं, अगर विभिन्न प्रकार के टूल के साथ केवल कुछ और नहीं है। –

+1

आप कहते हैं कि बंडलर की वेबसाइट यह नहीं बताती है कि "किसी अन्य से एक परियोजना को अलग कैसे करें"। यदि "पृथक" का अर्थ है प्रत्येक प्रोजेक्ट में सटीक उसी मणि और संस्करण (जैसे रैक-1.4.0) की एक अलग प्रति है, तो बंडलर ऐसा नहीं करता है। यह डिस्क पर प्रत्येक मणि की एक प्रतिलिपि बनाए रखता है - और किसी भी ऐप जिसे उस मणि और संस्करण की आवश्यकता होती है, अन्य ऐप्स के साथ हस्तक्षेप किए बिना इसका उपयोग कर सकती है।यह 'bash' के 2 उदाहरण चलाने जैसा है; आपके पास डिस्क पर 'bash' की कई प्रतियां नहीं हैं, लेकिन स्मृति में कई प्रतियां हैं। जेम्सट्स आपको डिस्क पर कई प्रतियां रखने देता है (जो अब आवश्यक होने पर हटाना आसान हो सकता है) – Kelvin

उत्तर

12

मान लें कि आपके पास रेल 3.1.0 इंस्टॉल हैं, लेकिन आप रेल 3.2.13 का उपयोग करके एक नई परियोजना बनाना चाहते हैं जो स्थापित नहीं है।

मान लें कि आप नई परियोजना ~/projects/Project2 में होना चाहते हैं।

gem install rails -v 3.2.13 
cd ~/projects 
rails _3.2.13_ new Project2 

यह आपके लिए Gemfile, रेल आप कमांड लाइन पर निर्दिष्ट के संस्करण के लिए बंद कर दिया पैदा करेगा।

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

आपको थोड़ा और जागरूक होना चाहिए, क्योंकि अधिकांश आदेश, जैसे rake, आपके द्वारा स्थापित rake का नवीनतम संस्करण लोड करेगा। सही संस्करण लोड होने के लिए आपको bundle exec rake ... चलाने की आवश्यकता होगी। आम तौर पर rails को छोड़कर मैं सभी आदेशों के लिए bundle exec चलाऊंगा। आप इसे छोटा बनाने के लिए उपनाम बना सकते हैं (मैं bex का उपयोग करता हूं)। मणि निष्पादन योग्य के साथ इसे स्वचालित करने के लिए, आप rbenv-binstubs का उपयोग कर सकते हैं, लेकिन आपको अभी भी पता होना चाहिए कि गैर-मणि निष्पादन योग्य ruby और irb स्वचालित रूप से Gemfile का उपयोग नहीं करेंगे।

Sidenote: rails newbundle install, जो निर्भरता के नवीनतम संस्करण के लिए जाँच करेगा चलेंगे। यदि आप वर्तमान में स्थापित रत्नों का उपयोग करने के लिए बंडलर चाहते हैं जो निर्भरता आवश्यकताओं को पूरा करते हैं, तो आप bundle installrails new --skip-bundle के साथ छोड़ सकते हैं, फिर ऐप डीआईआर में bundle check चलाएं।

सिडेनोटे 2: मान लीजिए कि आप Project2 (उदा। 2.1.8) के लिए रूबी संस्करण का उपयोग करना चाहते हैं जो डिफ़ॉल्ट से अलग है (उदा। 2.3.0)। उस स्थिति में, ऊपर निर्दिष्ट अनुसार gem install चलाना 2.3.0 के तहत रत्न स्थापित करेगा, जो समय की बर्बादी है क्योंकि आपको फिर से 2.1.8 के तहत रत्न स्थापित करने की आवश्यकता होगी। इस समस्या का समाधान करने के लिए आप वातावरण चर के माध्यम से पसंदीदा संस्करण का उपयोग करने के आदेशों के लिए मजबूर कर सकते हैं:

RBENV_VERSION=2.1.8 gem install rails -v 3.2.13 
cd ~/projects 
RBENV_VERSION=2.1.8 rails _3.2.13_ new Project2 
echo 2.1.8 > Project2/.ruby-version 

आप सका उपयोग rbenv shell चर सेट करने के लिए है, लेकिन मैं केवल अनुशंसा करते हैं कि अगर आप को rbenv नहीं करना चाहते उस खोल की अवधि के लिए .ruby-version फ़ाइलों पर आधारित ऑटो-स्विच। यह भूलना बहुत आसान है कि आपके पास चर सेट है, और जब आप किसी भिन्न प्रोजेक्ट को सीडी करते हैं, तो यह आपके द्वारा अपेक्षित संस्करण का उपयोग नहीं करेगा।

+0

पुन: Sidenote 2 : मुझे लगता है कि मैं चर नाम को भूलने के लिए उपयुक्त होगा और इसे देखना होगा। समय के लायक नहीं है। एक त्वरित 'आरबीएनवी शैल' सत्र के लिए बस एक नई विंडो खोलने के लिए बेहतर, तुरंत बंद करना। व्यक्तिगत रूप से, मेरे लिए याद रखना आसान होगा। YMMV। इसके अलावा, यदि आप _all_ कमांड के लिए 'बंडल निष्पादन' का उपयोग करते हैं, तो _including_ 'रेल ', बंडलर आपको पकड़ लेगा अगर आप भूल गए कि आपने' rbenv shell' चलाया है और किसी अन्य प्रोजेक्ट फ़ोल्डर में चला गया है। –

+0

बंडलर के साथ रेल शुरू नहीं करने के लिए आपका तर्क क्या है। (पुन: "आमतौर पर मैं रेल को छोड़कर सभी आदेशों के लिए बंडल निष्पादन चलाऊंगा") –

+0

n.b. कुछ उपनाम मैं आदी हूं: उपनाम = 'बंडल निष्पादन'; उपनाम brs = 'रेल सर्वर बनें'; उपनाम brc = 'रेल कंसोल बनें'; –

42

अधिकांश लोग रेलवे मणि को gem install rails के माध्यम से पहले स्थापित करके इसे हल करते हैं। यदि आप किसी कारण से ऐसा करने से इनकार करते हैं, तो आप स्वचालित बंडलिंग से ऑप्ट आउट कर सकते हैं कि रेल आपके लिए प्रयास करने का प्रयास करता है। यह आपकी रूबी प्रबंधन प्रणाली पर ध्यान दिए बिना पूरी तरह से काम करेगा।

mkdir myapp 
cd myapp 
echo "source :rubygems" > Gemfile 
echo "gem 'rails', '3.2.2'" >> Gemfile 
bundle install --path vendor/bundle 
bundle exec rails new . --skip-bundle 

संकेत देने पर, प्रकार "Y" (के रूप में आप चाहें, तो या नहीं) डिफ़ॉल्ट रेल एक साथ अपने Gemfile को बदलने के लिए। फिर, इसके पूरा होने पर:

bundle install 

आप काम हो गया है, और आप rubygems में रेल मणि की स्थापना के बिना अपनी पसंद के संस्करण के साथ एक नई रेल एप्लिकेशन boostrapped है।

+3

इस समाधान से असंबद्ध है, लेकिन अपनी .bundle/config फ़ाइल को कभी संपादित नहीं करें। यदि आप किसी प्रोजेक्ट के लिए रत्न को अलग करना चाहते हैं, तो 'बंडल इंस्टॉल - पैथ विक्रेता/बंडल' का उपयोग करें। – indirect

+0

धन्यवाद, अप्रत्यक्ष! क्या आप अपनी टिप्पणी पर विस्तृत जानकारी दे सकते हैं? ~/.bundle/config दृष्टिकोण के साथ क्या गलत है? --पथ का उपयोग करने के लिए बेहतर क्यों है? –

+0

और जब हम ~/.bundle/config के विषय पर हैं, तो ट्रिपल-डैश क्या करता है? –

8

http://rakeroutes.com/blog/how-to-use-bundler-instead-of-rvm-gemsets/ पर अच्छी तरह से जेम्स/बंडलर के विषय पर एक अच्छी हालिया पोस्ट है, जो आप अपने आरबीएनवी सेटअप पर लागू कर सकते हैं।

+0

बहुत अच्छा लेखन। अगर मैं उसे जानता था, तो मुझे [मेरा] प्रकाशित नहीं करना पड़ेगा (http://www.relativkreativ.at/articles/managing-multiple-rails-versions-with-rbenv) :-) –

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