टी एल; डॉ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 का उपयोग करता हूं, तो मैं मैन्युअल रूप से ऐप/संपत्ति पेड़ बना सकता हूं। लेकिन वह सिर्फ मुझे परेशान करता है। क्या कोई बेहतर तरीका नहीं है?
आपके जैसे लगता है वास्तव में आरवीएम और रत्नों का उपयोग करना चाहते हैं। कोई भी विशेष कारण जिसे आप चुन रहे हैं वह टूल का उपयोग न करें जो आपकी समस्या को सबसे सुंदर तरीके से हल करता है? –
मैं किसी भी विशेष उपकरण के लिए प्रतिबद्ध नहीं हूं (और मैं बिल्कुल "आरवीएम बनाम आरबीएनवी" चर्चा में शामिल नहीं होना चाहता हूं)। मैं आरवीएम से अधिक परिचित हूं और मैं इसका उपयोग करने के लिए वर्कफ़्लो समझता हूं। मैं rbenv के लिए समकक्ष वर्कफ़्लो को समझना चाहता हूं, अगर विभिन्न प्रकार के टूल के साथ केवल कुछ और नहीं है। –
आप कहते हैं कि बंडलर की वेबसाइट यह नहीं बताती है कि "किसी अन्य से एक परियोजना को अलग कैसे करें"। यदि "पृथक" का अर्थ है प्रत्येक प्रोजेक्ट में सटीक उसी मणि और संस्करण (जैसे रैक-1.4.0) की एक अलग प्रति है, तो बंडलर ऐसा नहीं करता है। यह डिस्क पर प्रत्येक मणि की एक प्रतिलिपि बनाए रखता है - और किसी भी ऐप जिसे उस मणि और संस्करण की आवश्यकता होती है, अन्य ऐप्स के साथ हस्तक्षेप किए बिना इसका उपयोग कर सकती है।यह 'bash' के 2 उदाहरण चलाने जैसा है; आपके पास डिस्क पर 'bash' की कई प्रतियां नहीं हैं, लेकिन स्मृति में कई प्रतियां हैं। जेम्सट्स आपको डिस्क पर कई प्रतियां रखने देता है (जो अब आवश्यक होने पर हटाना आसान हो सकता है) – Kelvin