2010-12-21 19 views
6

मैं अपने प्रोजेक्ट है कि दोनों पीडीएफ नाम स्थान का दावा में दो जवाहरात का उपयोग करने की जरूरत है।परस्पर विरोधी माणिक रत्न

क्या उन्हें एक साथ अच्छा खेलने के लिए कोई रास्ता है? एकमात्र तरीका मैं सोच सकता हूं कि एचटीएमल्डोक के अपने संस्करण को फिर से लिखना है ताकि इसे एक अलग नामस्थान दिया जा सके।

+0

+1 अच्छा सवाल। यह एक बुरा समस्या है कि मेरे पास एक आसान फिक्स नहीं है। यह सवाल पूछता है कि आपको पीडीएफ पढ़ने के लिए दोनों की जरूरत क्यों है, लेकिन मुझे यकीन है कि आपके पास आपके कारण हैं। – EnabrenTane

+0

यह क्या त्रुटि संदेश देता है? –

+1

यह संभवतः एक पुनर्लेखन करना संभव है, यह देखते हुए कि आप स्थानीय रूप से अपने स्वयं के रत्नों को बना और स्थापित कर सकते हैं। –

उत्तर

2

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

  • तो यह कांटे से या एक है कि कम से कम काम हो रहा है कांटा अगर दोनों Github पर हैं।
  • यदि गीमब पर न तो मणि है, तो देखें कि क्या आप स्रोत को पकड़ सकते हैं (मणि से इसे पकड़ना एक संभावना है, लेकिन असली भंडार ढूंढना सहायक हो सकता है क्योंकि वहां अन्य फाइलें हो सकती हैं जिनमें शामिल नहीं हैं मणि), और इसे गितूब पर एक भंडार में डाल दिया। सुनिश्चित करें कि मणि का लाइसेंस यह अनुमति देता है (जो लगभग सामान्य रूप से करता है यदि यह सामान्य ओपन सोर्स लाइसेंसों में से एक है)।
  • अपने बदलाव करें।
  • यकीन है कि वहाँ है भंडार की जड़ में एक .gemspec फ़ाइल बनाने, अगले कदम अन्यथा काम नहीं करेगा।
  • उपयोग Bundler अपनी परियोजनाओं निर्भरता प्रबंधन करने के लिए।पुस्तकालय के लिए निर्भरता निर्दिष्ट करने के बजाय आप

    के रूप में संशोधित किया
    gem 'the_gem' 
    

    इस तरह यह निर्दिष्ट करें:

    gem 'the_gem', :git => 'git://github.com/you/the_gem.git' 
    

    (लेकिन वास्तविक एक के लिए भंडार के लिए URL बदल)

  • आपके द्वारा संशोधित मणि के रखरखाव के लिए एक ई-मेल भेजें और उसे अगली रिलीज में अपने परिवर्तनों में विलय करने पर विचार करें।

बंडलर कम से कम परेशानी वाले रत्नों के वैकल्पिक संस्करणों का उपयोग करना वास्तव में आसान बनाता है। मैं अक्सर फोर्क रत्न, बग ठीक करता हूं या सुविधाओं को जोड़ता हूं, मेरे संस्करण को इंगित करने के लिए अपना Gemfile बदलें, फिर रखरखाव से मेरे परिवर्तनों में विलय करने के लिए कहें। कब, या यदि ऐसा होता है, तो मैं बस मणि के आधिकारिक संस्करण को संदर्भित करने के लिए बस अपना Gemfile बदलता हूं।

एक वैकल्पिक रणनीति, यदि रखरखाव आपके परिवर्तनों में विलय नहीं करना चाहता है और आप अपने संस्करण को दूसरों को वितरित करना चाहते हैं, तो अपने संस्करण को रूबीगेम्स को एक नए मणि के रूप में धक्का देना है, लेकिन उस मामले में मणि नाम का उपसर्ग आपका नाम, या कुछ अन्य स्ट्रिंग जो आपके मणि को एक संस्करण के रूप में पहचानती है।

+0

इस तरह मैंने जाने का फैसला किया। मूल github पर है: https://github.com/craigw/htmldoc, मैंने फोर्क किया और बनाया: https://github.com/jemminger/namespaced_htmldoc – jemminger

0

मैंने परिष्करण नामक कार्यक्षमता के एक नए टुकड़े के बारे में सुना है। यह एक ही वर्ग को प्रभावित करने वाले दो अलग-अलग बंदरगाहों से बचने के लिए डिज़ाइन किया गया है, लेकिन मुझे लगता है कि यह आपकी समस्या से मदद कर सकता है या नहीं।

+0

एक आओ, परिष्करण के एक कामकाजी प्रोटोटाइप कार्यान्वयन भी नहीं है। यह सुझाव देते हुए कि उसे ऐसा कुछ देखना चाहिए जो सुझाव दे रहा है कि वह परी और यूनिकोरों की मदद लेता है। – Theo

+0

@Theo: [इस ब्लॉग पोस्ट] के अनुसार (http://timeless.judofyr.net/refinements-in-ruby), यह केवल परिशोधन पैच स्थापित करने के लिए तीन पंक्तियां लेता है। क्या आप स्पष्ट कर सकते हैं कि आपका क्या मतलब है? –

+0

"कुछ कार्यान्वयन विवरण हैं जिन्हें हल करने की आवश्यकता हो सकती है" (उसी पोस्ट से)। रुबी दुभाषिया को पैच करें ... क्या आप गंभीरता से सुझाव दे रहे हैं कि समाधान के रूप में? – Theo

5

असल में, ऐसा कुछ भी नहीं है जो आप कर सकते हैं। यह रूबी में अच्छा अभ्यास, इस कारण के लिए शीर्ष स्तर के नाम स्थान में विशिष्ट नाम का उपयोग करने ठीक है, और आप सिर्फ दो पुस्तकालयों कि कि अभ्यास का उल्लंघन पर ठोकर हुआ।

एक बात आपको Kernel#require के बजाय Kernel#load का उपयोग करना है। Kernel#load एक वैकल्पिक बूलियन तर्क लेता है, जो इसे अज्ञात मॉड्यूल के भीतर फ़ाइल का मूल्यांकन करने के लिए बताएगा। हालांकि, ध्यान रखें कि यह सुरक्षित कोई रास्ता नहीं में है: यह शीर्ष स्तर के नाम स्थान (module ::PDF की तरह कुछ का उपयोग) और इस तरह गुमनाम मॉड्यूल को तोड़ने में स्पष्ट पुट सामान के लिए संभव पूरी तरह से है।

यह भी ध्यान रखें एपीआई वास्तव में भद्दा है कि: load बस true या false, require जैसे करता है देता है। (वास्तव में, के बाद से loadहमेशा लोड हो जाए, यह हमेशा रिटर्न true।) वहाँ कोई रास्ता नहीं है वास्तव में गुमनाम मॉड्यूल पर प्राप्त करने के लिए है। आपको मूल रूप से हाथ से ObjectSpace से इसे पकड़ना होगा। ओह, और जाहिर है, कुछ भी नहीं है वास्तव में गुमनाम मॉड्यूल का संदर्भ के बाद से, यह कचरा-एकत्र हो जाएगा, इसलिए आप केवल को ObjectSpace की आंत में चारों ओर चप्पा चप्पा छान मारना मॉड्यूल लगता है नहीं है, आप भी दौड़ करने के लिए है कचरा इकट्ठा करने वाला।

कभी कभी, मैं चाहता हूँ रूबी Newspeak, मानक ML या रैकेट की तरह एक उचित मॉड्यूल प्रणाली था।

+0

और सभी रूबी कार्यान्वयनों में 'ऑब्जेक्टस्पेस' नहीं है, क्या वे करते हैं? –

+1

@Andrew Grimm: मुझे IronRuby के बारे में निश्चित नहीं है, लेकिन JRuby को 'ऑब्जेक्टस्पेस' each_object (मॉड्यूल) 'करने के लिए कम से कम प्रासंगिक बिट्स हैं, भले ही इसमें' ऑब्जेक्टस्पेस 'का पूर्ण कार्यान्वयन न हो। –

0

मैं में जुड़े हुए https://stackoverflow.com/a/37311072/292780

सम्मान से जवाब ऊपर से असहमत इस जवाब दे दिया।

ruby -S gem list my_gem

`*** LOCAL GEMS *** 
my_gem (1.0.1, 1.0.0, 0.0.2) 
` 

ruby -S gem lock my_gem-1.0.0 > locklist.rb

जो locklist में किसी विशेष संस्करण के लिए निर्भरता की सूची उत्पन्न करता है

require 'rubygems' 
gem 'my_gem', '= 1.0.0' 
gem 'gem_base', '= 1.0.0' 
gem 'rest-client', '= 1.7.2' 
gem 'savon', '= 1.1.0' 
gem 'addressable', '= 2.3.6' 
gem 'mime-types', '= 1.25.1' 
gem 'netrc', '= 0.11.0' 

अब आप load('locklist.rb') कर सकते हैं जो लोड होगा: यहाँ मैं इसे कैसे करते है इसकी निर्भरताओं के साथ एक मणि का एक विशिष्ट संस्करण। देखो माँ, कोई बंडलर नहीं।

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