2012-09-02 5 views
20

सामान्य रूप से एक परियोजना के साथ बंडलर का उपयोग करते समय और विशेष रूप से रेल, आपके पास केवल आपके जेमफाइल में परिभाषित रत्नों तक पहुंच है। हालांकि यह समझ में आता है, यह सीमित हो सकता है। अधिकांशतः मुझे यह सीमित लगता है जब मैं एक निश्चित आरएसपीसी फॉर्मेटर का उपयोग करना चाहता हूं जो बाकी टीम का उपयोग नहीं करती है। जब तक यह Gemfile में नहीं है, यह सुलभ नहीं है।बंडलर के साथ काम करते समय जेमफाइल में रत्नों का उपयोग कैसे करें?

इसके आसपास किसी भी तरह से या मुझे इसे Gemfile में जोड़ना है?

अद्यतन: मेरी समस्या बंडलर लेकिन स्पार्क नहीं थी। बिना स्पार्क के आरएसपीसी चलाते समय मुझे जो भी फॉर्मेटर चाहिए था उसका उपयोग करने में कोई समस्या नहीं थी।

अद्यतन # 2: ऐसा लगता है कि बंडलर का उपयोग अभी भी समस्या का कारण है। स्पार्क का उपयोग करने और स्पार्क का उपयोग न करने के बीच अंतर यह है कि जब स्पार्क के बिना आरएसपीसी चलाते हैं, तो यह आपके प्रोजेक्ट को लोड करने और बंडलर "सैंडबॉक्स" में आने से पहले फॉर्मेटर लोड करता है।

Bundler साथ

:

$ bundle exec irb 
>> require 'fivemat' 
LoadError: cannot load such file -- fivemat 

from (irb):1:in `require' 
from (irb):1 
from /Users/arikfr/.rvm/rubies/ruby-1.9.3-p194/bin/irb:16:in `<main>' 

Bundler के बिना:

$ irb 
>> require 'fivemat' 
=> true 
+0

क्यों आप के लिए fivemat न जोड़ें अपने gemfile? –

+4

"ज्यादातर मुझे यह सीमित लगता है जब मैं एक निश्चित आरएसपीसी फॉर्मेटर का उपयोग करना चाहता हूं जो बाकी टीम का उपयोग नहीं करती है।" इसीलिए। कभी-कभी मैं ओएस/एक्स पर समर्थित रत्नों का उपयोग करना चाहता हूं लेकिन उबंटू (और इसके विपरीत) पर समर्थित नहीं है। – arikfr

+0

ओएस एक्स/लिनक्स मुद्दे को रूबी प्लेटफ़ॉर्म https://github.com/carlhuda/bundler/issues/663#issuecomment-2849045 –

उत्तर

10

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

विचार मूल रूप से होल्गर के उत्तर की निर्भरताओं को बदल रहा है, जैसे कि साझा जेमफाइल को संशोधित करने की कोई आवश्यकता नहीं है। बंडलर which file is to be used as the gemfile निर्दिष्ट करने की अनुमति देता है, लेकिन अजीब तरीके से प्रलेखित विधियों do not apparently work with its configuration file and will not be fixed। बंडलर की कुछ हद तक अस्पष्ट विशेषता है कि किसी भी कॉन्फ़िगरेशन विकल्प को पर्यावरण चर में सेट किया जा सकता है या कमांड लाइन पर पास किया जा सकता है। bundle [command] --gemfile [yourgemfile] या BUNDLE_GEMFILE="[yourgemfile]" bundle [command] के रूप में आपके सभी आदेशों को चलाना बंडलर को जो भी रत्न आप चाहते हैं उसे पढ़ने के लिए कारण देगा। मैं पर्यावरण परिवर्तनीय दृष्टिकोण का उपयोग करने की अत्यधिक अनुशंसा करता हूं, और या तो अपने मौजूदा सत्र के लिए उपनाम या चर का निर्यात करता हूं, विशेष रूप से क्योंकि मैं "exec" कमांड के साथ कमांड लाइन स्विच का उपयोग करने में असमर्थ था।

इसलिए, मैं इस तरह rspec चलाता हूं: BUNDLE_GEMFILE="[mygemfile]" bundle exec rspec [filename], और मेरे पास इस bashrc में bem के रूप में इस उपनाम का पहला हिस्सा है। एक जादू की तरह काम करता है।

फिर, आपको अपने जेमफाइल को अनदेखा करने के लिए अपने स्रोत नियंत्रण को सेट करना चाहिए, या तो परियोजना के .gitignore में या परियोजना को पूरी तरह से स्वच्छ रखने के लिए, अपनी व्यक्तिगत वैश्विक अनदेखी फ़ाइल (जो डिफ़ॉल्ट रूप से है) ~/.config/git/ignore और प्रोजेक्ट की गिटिनोर फ़ाइल के समान प्रारूप है)।

ध्यान देने योग्य एक और बात यह है कि बंडलर जेमफाइल के नाम पर आधारित लॉकफाइल बनाएगा। यह बहुत आसान है, क्योंकि यह आपको अपने प्रोजेक्ट के Gemfile को ओवरराइट करने से रोकता है। अगर इसे चेक किया गया है, तो आपको इस नई लॉक फ़ाइल को अनदेखा करने की आवश्यकता है। यदि आपका रत्न Foo.bar है, तो Foo.bar.lock देखें।

अंत में, आप अपने कस्टम Gemfile में होल्गर के सुझाव के लिए इसी तरह कुछ कर सकते हैं:

source "http://rubygems.org" 
gem "fivemat" 
instance_eval(File.read(File.dirname(__FILE__) + "/Gemfile")) 

और तुम जाना अच्छा कर रहे हैं, जब तक आप अपने Gemfile निर्दिष्ट करने के लिए याद के रूप में।

+0

यह दृष्टिकोण सबसे अच्छा है जिसे मैं जानता हूं, लेकिन दुर्भाग्य से शामिल जेमफाइल के Gemfile.lock में मणि संस्करणों को संरक्षित नहीं करता है। मुझे एक समाधान देखना अच्छा लगेगा। –

+0

आप 'bundle --gemfile Gemfile' – Ritchie

+0

के साथ Gemfile.lock (Foo.bar.lock के विपरीत) अपडेट कर सकते हैं मैंने [यह रेपो] (https://github.com/ritchiey/play-nice) बनाया है आप इस कार्यक्षमता को प्राप्त करने के लिए ** अपने आवेदन के भीतर ** निर्देशिका में कांटा और क्लोन कर सकते हैं। – Ritchie

0

मामले में आप अभी भी इस (भयानक विचार) करने का फैसला:

आप करने के लिए अपने Gemfile को गहरे लाल रंग का कोड जोड़ सकते हैं अगर यह मौजूद है तो ~/.gemfile (या ऐसे) लोड करें।

कुछ की तरह:

eval(IO.read('~/.gemfile'), binding) if FileTest.exists?("~/.gemfile") 
+0

समान विचार भी थे, क्या मैं बस नहीं कर सकता: eval के बजाय requ_relative '~/.gemfile'? – arikfr

13

ChiliProject हम उपयोगकर्ताओं को एक Gemfile.local जो मुख्य Gemfile लोड पर में शामिल किया गया है बनाने के लिए अनुमति देते हैं। यह उपयोगकर्ताओं को अपडेट को आसान बनाने के लिए हमारे Gemfile को बदलने के बिना अतिरिक्त रत्न निर्दिष्ट करने की अनुमति देता है।

इसके लिए, हमने निम्नलिखित कोड at the bottom of our Gemfile शामिल किया है।

gemfile_local = File.expand_path('Gemfile.local', __dir__) 
if File.readable?(gemfile_local) 
    puts "Loading #{gemfile_local}..." if $DEBUG 
    instance_eval(File.read(gemfile_local)) 
end 

Gemfile.local ही .gitignore के माध्यम से भंडार से बाहर रखा गया है।

+0

अच्छा, सुरुचिपूर्ण समाधान! –

+0

यह मेरे लिए पूरी तरह से काम किया! यह स्वीकार्य उत्तर होना चाहिए। :) –

+5

इस समाधान में 'Gemfile.lock'' Gemfile.local' से प्रभावित होता है, इसलिए यह उन परियोजनाओं के लिए अच्छी तरह से काम नहीं करेगा जहां 'Gemfile.lock' को VCS द्वारा ट्रैक किया जाता है। – user1614572

1

आप अपने Gemfile में कुछ इस तरह उपयोग कर सकते हैं:

gem 'foo' if ENV['ENABLE_FOO_GEM'] 

तो बस अपने वातावरण में ENABLE_FOO_GEM निर्धारित किया है।

export ENABLE_FOO_GEM=1 

मणि डिफ़ॉल्ट रूप से अक्षम कर दिया जाएगा, लेकिन आसानी से किसी को भी जो इसका इस्तेमाल करना चाहता है से पर (स्थायी रूप से) बदल गया।

0

.gitignore

Gemfile.local 
Gemfile.local.lock 

में जोड़े परियोजना निम्नलिखित सामग्री के साथ एक Gemfile.local.sample फ़ाइल में जोड़ें:

# Include gems that are note meant to be part of the project but for development purposes 
# That's why Gemfile.local and Gemfile.local.lock must be git-ignored 

# To use these gems: 
# 1. Create a "Gemfile.local" file (at same level of "Gemfile") 
# 2. Prepend "BUNDLE_GEMFILE=Gemfile.local" before "bundle install" or "bundle exec rails c" and so forth. 

eval_gemfile "./Gemfile" 

group :development, :test do 
    # Suggested gems 
    gem "awesome_print", require:"ap" 
    gem "hirb" 
    gem "pry" 
    gem "pry-byebug" 
    gem "pry-rails" 
    gem "meta_request" 

    # My gems 
    gem "fivemat" 
end 
संबंधित मुद्दे