Rails3 प्रोजेक्ट से रत्नों की स्थापना का सबसे अच्छा तरीका क्या है?


102

मैंने अपने सभी रत्नों को Gemfile के माध्यम से बंडल का उपयोग करके स्थापित किया। मैंने सोचा (गलती से) कि अगर मैंने अपने जेमफाइल से एक मणि को हटा दिया और 'बंडल इन्स्टाल' चला दिया कि हटाए गए रत्नों की स्थापना रद्द हो जाएगी। मैंने बंडलर हेल्प फ़ाइल को देखा है और, जहाँ तक मैं बता सकता हूँ, इसमें रत्नों की स्थापना रद्द करने का कोई तरीका नहीं है।

क्या मैं हर चीज के लिए सिर्फ जेम अनइंस्टॉल एक्स का इस्तेमाल करता हूं? क्या यह बन्धु को भ्रमित करने वाला है?

जवाबों:


136

Bundler को आपके ऐप के रूट डायरेक्टरी से लॉन्च किया जाता है, ताकि यह सुनिश्चित हो सके कि आपके ऐप को काम करने के लिए सभी आवश्यक रत्न मौजूद हैं। यदि किसी कारण से आपको किसी ऐसे रत्न की आवश्यकता नहीं है, जिसे आपको चलाना होगा

    gem uninstall gem_name 

जैसा कि आपने ऊपर कहा था। हर बार जब आप बंडलर चलाते हैं तो यह निर्भरता को कम कर देगा

EDIT - 24.12.2014

मैं देखता हूं कि लोग इस सवाल पर आते रहते हैं कि मैंने कुछ और जोड़ने का फैसला किया है। मैंने जो उत्तर दिया वह उस मामले के लिए था जब आप अपने रत्नों को वैश्विक बनाए रखते हैं। रत्नेव या आरवीएम जैसे रत्न प्रबंधक का उपयोग करने पर विचार करें ताकि विशिष्ट परियोजनाओं के लिए रत्नों के सेट को रखा जा सके।

इसका मतलब है कि कोई भी रत्न वैश्विक स्तर पर स्थापित नहीं किया जाएगा और इसलिए जब आप अपनी परियोजना के जेमफाइल और रेरन बंडल में से किसी एक को निकालते हैं, तो जाहिर है, यह आपके प्रोजेक्ट में लोड नहीं होगा। फिर, आप बंडल को क्लीन कर सकते हैं (प्रोजेक्ट dir के साथ) और यह सिस्टम से उन सभी रत्नों को हटा देगा जो एक बार आपके Gemfile (उसी dir में) से इंस्टॉल किए गए थे, लेकिन इस समय दिए गए समय अब ​​वहाँ सूचीबद्ध नहीं हैं ...। लंबी कहानी छोटी - यह अप्रयुक्त रत्नों को हटा देती है।


98

यह बंडल द्वारा स्थापित एक रत्न की स्थापना रद्द करेगा:

bundle exec gem uninstall GEM_NAME

ध्यान दें कि यह फेंकता है

त्रुटि: मणि निष्पादित करते समय ... (NoMethodError) अपरिभाषित विधि `हटाएं 'के लिए # <Bundler :: SpecSet: 0x00000101142268>

लेकिन मणि वास्तव में हटा दी जाती है। अगली बार जब आप bundle installमणि चलाते हैं तो उसे फिर से स्थापित किया जाएगा।


10
आरवीएम उपयोगकर्ताओं के लिए: आपको इस पद्धति का उपयोग करना होगा यदि आपने अपने विशेष प्रोजेक्ट के लिए एक रत्न निर्धारित किया है। gem uninstall pgप्रोजेक्ट फ़ोल्डर से चल रहा है बंडलर के बजाय अपने वैश्विक / सिस्टम स्तर के जेमसेट से pg को अनइंस्टॉल करेगा
एरिक हू

क्या यह त्रुटि है जिसका आप उल्लेख कर रहे हैं? ERROR: While executing gem ... (NoMethodError) undefined method `delete' for #<Bundler::SpecSet:0x00000101142268>
user664833

बंडल संदर्भ में इसे करने के लिए +1। काश यह उस त्रुटि को फेंक नहीं था! बेहतर अभी तक, काश मैं बंडल-रत्न अपडेट कर सकता था।
pduey

2
@EricHu नहीं अगर आप RVM रत्न का उपयोग कर रहे हैं। जब भी आप एक रत्न को आरवीएम रत्न के अंदर स्थापित करते हैं, तो वहां पर रत्न स्थापित होता है, इसलिए एक आरवीएम रत्न पर एक सादा रत्न अनइंस्टॉल करने से उस रत्न पर स्थापित रत्न हट जाएगा और सिस्टम एक नहीं होगा।
एस्टेबन फेल्डमैन

@EstebanFeldman तुम सही हो, मुझे लगता है कि यह पिछले 11 महीनों में RVM में किया गया बदलाव था।
एरिक हू

21

बंडल के नए संस्करणों के साथ आप स्वच्छ कार्य का उपयोग कर सकते हैं:

$ bundle help clean
Usage:
    bundle clean

Options:
    [--dry-run=only print out changes, do not actually clean gems]
    [--force=forces clean even if --path is not set]
    [--no-color=Disable colorization in output]
    -V, [--verbose=Enable verbose output mode]

Cleans up unused gems in your bundler directory
$ bundle clean --dry-run --force
Would have removed actionmailer (3.1.12)
Would have removed actionmailer (3.2.0.rc2)
Would have removed actionpack (3.1.12)
Would have removed actionpack (3.2.0.rc2)
Would have removed activemodel (3.1.12)
...

संपादित करें:

यह अनुशंसित नहीं है यदि आप एक वैश्विक रत्न का उपयोग कर रहे हैं (यानी - आपकी सभी परियोजनाएं अपने रत्न को उसी स्थान पर रखती हैं)। प्रत्येक परियोजना के रत्नों को अलग रखने के कुछ तरीके हैं, हालांकि:

  1. rvmरत्न ( http://rvm.io/gemsets/basics )
  2. bundle installनिम्नलिखित विकल्पों में से किसी के साथ: --deploymentया --path=<path>( http://bundler.io/v1.3/man/bundle-install.1.html )

bundle clean --forceरत्नों के एक समूह का उपयोग करके जिन्हें मैं अपनी वर्तमान परियोजना में उपयोग नहीं करता हूं, लेकिन अपनी अन्य परियोजनाओं में उपयोग करता हूं। क्या मुझे कोई रास्ता तय करना था? बस bundle cleanरिटर्न "- केवल बंडल क्लीन का उपयोग कर सकता है जब --पथ सेट है या --फोर्स सेट है"। लेकिन --pathविकल्प मदद में भी दिखाई नहीं देता है।
डेनिस

1
यह सही है @ डेनिस। cleanयदि आप एक वैश्विक रत्न का उपयोग कर रहे हैं तो यह कार्य वास्तव में कोई मतलब नहीं रखता है। लेकिन अगर आप चाहें, तो आपकी प्रत्येक परियोजना में इसके रत्न अलग हो सकते हैं। आप rvm gemsets (के माध्यम से ऐसा कर सकते हैं या तो rvm.io/gemsets/basics ), या के माध्यम से रत्नों 'पथ निर्दिष्ट करने के द्वारा --pathकरने का विकल्प bundle install( bundler.io/v1.3/man/bundle-install.1.html )
एव्जीनिया मनोलोवा

1

मणि की स्थापना के लिए आपको 'रत्न अनइंस्टॉल gem_name' का उपयोग करना चाहिए।

ध्यान दें कि यदि आपने मणि सिस्टम-वाइड (यानी। सुडोल बंडल इंस्टॉल) स्थापित किया है, तो आपको बाइनरी डायरेक्टरी को एन विकल्प का उपयोग करके निर्दिष्ट करना पड़ सकता है, ताकि यह सुनिश्चित हो सके कि मणि से संबंधित बायनेरिज़ को हटा दिया गया है। उदाहरण के लिए

sudo gem uninstall gem_name  -n /usr/lib/ruby/gems/1.9.1/bin

1

मैं बंडलर के माध्यम से मैन्युअल रूप से गेंडा मणि निकालकर इसे हल करने के लिए लग रहा था ("sudo बंडलर रत्न अनइंस्टॉल को अनइंस्टॉल करें"), फिर रिबंडलिंग ("sudo बंडल इंस्टॉल")।

यह सुनिश्चित नहीं है कि यह क्यों हुआ, हालांकि उपरोक्त फिक्स काम करने लगता है।


1

यदि आप अपने सभी रत्नों को साफ करना चाहते हैं और शुरू करना चाहते हैं

sudo gem clean

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