2010-09-21 12 views
6

कहें कि मैंने क्लोजर लाइब्रेरी में बदलाव किया है (उदाहरण के लिए, क्लोज-ओथ में अनुरोध-टोकन में पैरामीटर जोड़ा गया है) और मेरी प्रोजेक्ट में उस बदली गई लाइब्रेरी का उपयोग करना चाहता हूं। ऐसा करने का सबसे अच्छा तरीका क्या है, नई पुस्तकालय को जार के रूप में संकलित करने और इसे मेरे प्रोजेक्ट lib में कॉपी करने से कम?क्लोजर पुस्तकालयों के अपने संस्करणों का उपयोग कैसे करें?

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

उत्तर

6

आप सीधे आरईपीएल पर हैक कर सकते हैं। मान लीजिए कि आपको अपने क्लासपाथ पर incanter मिल गया है। एक आरईपीएल शुरू करें। पहली चीज़ जो हमें करने की ज़रूरत है वह इसमें incanter कक्षाएं लाती है।

user> (require 'incanter.core) 
nil 

अब हम फ़ंक्शन incanter.core/matrix देख सकते हैं?

user> (incanter.core/matrix? 2) 
false 

हम मूल स्रोत कोड देख सकते हैं:

incanter.core नाम स्थान के लिए सबसे पहले परिवर्तन:

user> (in-ns 'incanter.core) 
#<Namespace incanter.core> 

user> (require 'clojure.repl) 
nil 
user> (clojure.repl/source incanter.core/matrix?) 
(defn matrix? 
    " Test if obj is 'derived' incanter.Matrix." 
    ([obj] (is-matrix obj))) 
nil 

के जाने के लिए और इसे पेंच चलो फिर हम पुराने स्रोत कोड का उपयोग पालना के रूप में कर सकते हैं:

incanter.core> (defn matrix? [obj] "hello") 
#'incanter.core/matrix? 

यूनिट टेस्ट:

incanter.core> (matrix? 2) 
"hello" 

वापस उपयोगकर्ता नाम स्थान में स्विच करें:

incanter.core> (in-ns 'user) 
#<Namespace user> 

इसे आजमाएं:

user> (matrix? 2) 
; Evaluation aborted. 

वहाँ उपयोगकर्ता/मैट्रिक्स का कोई परिभाषा है। हमने incanter.core नेमस्पेस में इसे फिर से परिभाषित किया।

user> (incanter.core/matrix? 2) 
"hello" 

repl पर प्रयोग के लिए, यह ठीक है बस स्रोत फ़ाइलों को बदलने के लिए और एकल फाइल (Emacs में सीसी सी) फिर से संकलन, या यदि आप सही नाम स्थान में हो, बस परिभाषा फिर से मूल्यांकन ।

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

अब, अगर हम अपने मूल्यवान परिवर्तन को स्थायी और अन्य परियोजनाओं के लिए उपलब्ध करना चाहते हैं, तो यह इस बात पर निर्भर करता है कि सब कुछ कैसे स्थापित किया जाता है।

मैं निर्भरता प्रबंधन के लिए मेवेन का उपयोग करता हूं, इसलिए यह स्रोत फ़ाइल को संशोधित करने का एक प्रश्न होगा, और फिर पुस्तकालय के लिए नए संस्करण को संकलित करने और इसे स्थानीय मैवेन भंडार में स्थापित करने के लिए बिल्ड प्रक्रिया को फिर से चलाएगा।

एक Maven परियोजना के साथ

, कि के रूप में

$ mvn install 

संस्करण संख्याओं बारे में एक नोट के रूप में सरल किया जाना चाहिए:

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

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

आप हर बार जब आप अपने परिवर्तनों को भंडार में अपना रास्ता बनाना चाहते फिर से पुनः स्थापित करने की आवश्यकता होगी, लेकिन यह वास्तव में शायद एक अच्छी बात है।

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

आप यहाँ incanter के स्रोत प्राप्त कर सकते हैं:

$ Git क्लोन http://github.com/liebke/incanter.git

और प्रासंगिक स्रोत फ़ाइल है:

~/incanter/मॉड्यूल/incanter कोर/src/incanter/कोर। clj

मैट्रिक्स को तोड़ने के लिए इसे संशोधित करें? समारोह, और उसके बाद यह पता चला है कि आप क्या करना है:

बदलें दोनों शीर्ष स्तर project.clj में संस्करण संख्या, और भी submodule project.clj में।

तो फिर तुम lein incanter कोर निर्देशिका में फिर से शीर्ष-स्तरीय निर्देशिका में स्थापित चला, और फिर, और तुम इसी क्रम में यह करने के लिए किया है। मुझे समझ में नहीं आता क्यों।

फिलहाल यह सब बेकार में जटिल लगता है। मैं (काफी) सुनिश्चित हूं कि यह उपकरण परिपक्व होने के रूप में बस जाएगा।

4

यदि आप cake का उपयोग कर रहे हैं (या दिमाग का उपयोग नहीं करेंगे), तो README के ​​सबप्रोजेक्ट निर्भरता अनुभाग देखें। मुझे लगता है कि यह वही हो सकता है जो आप खोज रहे हैं।

-1

आप इसे अलग-अलग नाम के तहत क्लोजरों पर अपलोड करते हैं, उस पर निर्भर करते हैं।

+1

या Leiningen के साथ एक स्थानीय Maven भंडार – Greg

+0

उपयोग करते हैं, इस का उपयोग करते हुए 'lein स्थापित' किया जा सकता है। – Mars

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