2012-12-03 25 views
15

मैं इस तरह से कोशिश की थी में:एक रेल प्लगइन/इंजन के लिए एक स्थानीय मणि की निर्भरता कैसे जोड़ें, .gemspec फ़ाइल

s.add_dependency 'gem', :path => '../gem' 

gemfile, में मणि जोड़ने पसंद है, लेकिन यह काम नहीं करता है, और इस त्रुटि का कारण होगा:

/Users/chenqh/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/requirement.rb:81:in `parse': Illformed requirement 

उत्तर

15

यह संभावना स्थानीय निर्भरता को जोड़ने के लिए है, क्योंकि अन्य उपयोगकर्ताओं मणि उपयोग करने में सक्षम के रूप में यह स्थानीय निर्भर है और किसी काम का नहीं इसलिए बाद प्रकाशित नहीं किया जाएगा संभव नहीं है। इसके बजाय, अपने प्लगइन के gemspec में रिमोट निर्भरता जोड़ें।

कदम -

1) ओपन gemspec विक्रेता में अपने स्वयं के प्लगइन का फ़ाइल/plugins/my_plugin/ और कीवर्ड अंत से पहले जोड़ें: (

s.add_dependency('will_paginate', '~> 3.0.pre2') 

इस उदाहरण में मैंने my_plugin की आवश्यक निर्भरता will_paginate का उपयोग किया है)

2) अब अपने रेल ऐप में जाएं और Gemfile संपादित करें, जोड़ें:

gem 'my_plugin', :path=>'vendor/plugins/my_plugin' 

3) अब रेल एप्लिकेशन जड़ में क्या:

bundle install 

और my_plugin की निर्भरता (इस मामले में will_paginate) स्थापित किया गया है।

+0

धन्यवाद। इसलिए, मेरे द्वारा एक मणि लिखना असंभव है, केवल तभी जब मैं इस मणि को प्रकाशित करता हूं। असल में, मैं एक प्रकाशित मणि भाग को ओवरराइट करना चाहता हूं, और इसे अपने प्लगइन के साथ काम करना चाहता हूं। शायद मैं my_plugin के विक्रेता फ़ोल्डर में मणि डाल सकता था। –

+0

कहां से प्राप्त किया जाएगा? – Jwan622

27

2 रत्न, मणि 1 और मणि 2 विकसित करते समय, यह आवश्यक है कि जीम 1 स्थानीय रूप से मणि 2 पर निर्भर करता है, काफी आसान है।

आप इसे अपने gemspec में नहीं कर सकते हैं, हालांकि, आप अपने मणि के Gemfile में ऐसा कर सकते हैं!

# Gemfile 
source "https://rubygems.org" 

gem 'gem2', :path => '../gem2' 

# Specify your gem's dependencies in gem1.gemspec 
gemspec 

और फिर अपने gemspec में, अपने मणि की आवश्यकता होती है जैसा आप आमतौर पर अगर उस मणि को पहले से ही प्रकाशित किया गया था होगा:

# gem1.gemspec 
spec.add_runtime_dependency "gem2" 

बस सुनिश्चित करें कि आप गलती कि Gemfile परिवर्तन धक्का नहीं करते हैं!

+1

मुझे इसके साथ परेशानी हो रही है। यदि मणि कमांड के साथ 'gem2' स्थापित नहीं है, तो मुझे 'आवश्यकता' मिलती है: gem1 के कोड में 'gem2' की आवश्यकता होने पर gem2' ऐसी फ़ाइल लोड नहीं हो सकती है। – Ninjaxor

+0

सुनिश्चित करें कि gem1 के Gemfile में gem2 का पथ सही है। यदि आवश्यक हो तो एक पूर्ण पथ का प्रयोग करें। – Ashitaka

+2

संदेश और उत्तर के लिए धन्यवाद। मैंने उस पर एक और झटका लगा और एक निर्भरता के रूप में 'रेक' जोड़ने की जरूरत थी। – Ninjaxor

1

कभी-कभी आप एक मणि को किसी अन्य मणि में एम्बेड करना चाहते हैं, क्यों नहीं। आप एक स्थानीय मणि को पूरी तरह से encapsulate करने के लिए एक से एक gempec संदर्भ कर सकते हैं।

require "rubygems" 

embedded_gemspec = Gem::Specification::load("path/to/internal.gemspec") 

Gem::Specification.new do |spec| 
    spec.name   = "gem_that_contains_another_gem" 
    # spec.whatever, = whole bunch of other info 

    #      our files    + other gem's files 
    spec.files   = ['file1.rb', 'file2.rb'] + embedded_gemspec.files 

    # our dependencies 
    spec.add_dependency 'nokogiri' 
    # other gem's dependencies 
    embedded_gemspec.runtime_dependencies.each { |d| spec.add_dependency d } 

end 

संपादित करें: यह केवल स्थानीय रूप से काम करता प्रतीत होता है। यदि आप इस gemspec को स्थापित करने का प्रयास करते हैं, तो एक गिट रेपो कहें, यह नहीं जान पाएगा कि embedded_gemspec कहां प्राप्त करें (भले ही embedded_gemspec की निर्भरताएं ठीक से आती हैं)।