2010-10-11 9 views

उत्तर

48

इस उत्तर तो यह अब काफी के लिए 2014

Leiningen इसे अद्यतन करने के संपादित किया जाता है और केक 2011 Leiningen (संस्करण 2) में वापस विलय कर दिया StackOverflow में Leiningen के लिए एक संदर्भ के रूप में, ब्याज पाने के लिए शायद जारी है अब है वास्तव में क्लोजर स्वचालन उपकरण।

Leiningen निर्माण उपकरण और Clojure के लिए निर्भरता प्रबंधक जो उचित रूप से कॉन्फ़िगर classpath के साथ और सभी जावा और clojure निर्भरता आधारित Maven खजाने और/या समुदाय से एक स्वचालित ढंग से हासिल कर ली के साथ एक इंटरैक्टिव आरईपीएल की स्थापना करने की क्षमता शामिल है Clojars

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

अनुभव सिफारिशों की एक संख्या के लिए नेतृत्व और तेजी से चीजों को करने के लिए दृष्टिकोण है https://github.com/technomancy/leiningen/wiki/Faster

24

मुख्य अंतर यह है जिस तरह से कार्य कार्यान्वित कर रहे हैं में है।

केक का दृष्टिकोण "परिभाषित किए जाने के बाद कार्यों को विस्तार करना मुश्किल है, इसलिए आइए कार्यों के बजाय कार्यों के लिए एक नई तंत्र का आविष्कार करें", जिसके परिणामस्वरूप डेफटास्क मैक्रो।

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

+1

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

+0

जब कार्य केवल कार्य होते हैं, तो आप उन्हें अधिक दिलचस्प तरीके से बढ़ा सकते हैं। इस लीनिंगेन प्लगइन को गवाह करें: http://github.com/technomancy/rodney-leonard-stubbs केक का कार्य एक्सटेंशन केवल साइड-इफेक्ट्स को जोड़ने/प्रीपेड करने की अनुमति देता है, जबकि लीनिंगेन रीबंडिंग की अनुमति देता है, तर्क/वापसी मूल्य बदलता है, और सशर्त निष्पादन भी देता है। – technomancy

+0

केक कार्यों में फ़ंक्शन कॉल भी हो सकते हैं, इन सभी सुविधाओं का समर्थन – lancepantz

19

जैसा कि एलेक्स ने उल्लेख किया है, सबसे हड़ताली अंतर कमांड लाइन से गति है। केक एक सतत JVM का उपयोग करता है, इसलिए जब आप पहली बार अपनी परियोजना के भीतर कोई कार्य चलाते हैं तो आप केवल jvm स्टार्टअप ओवरहेड का सामना करते हैं। यदि आप Emacs + कीचड़ + क्लोजर-टेस्ट-मोड का उपयोग नहीं कर रहे हैं, तो यह एक बड़ा टाइमवेवर हो सकता है। उदाहरण के लिए, मेरी परियोजनाओं में से एक पर परीक्षण का एक बड़ा सेट सेट केक में 0.3 सेकंड में चलता है, जो कि लीन में बनाम 11.2 है।

प्रदर्शन के अलावा, केक के पीछे मूल विचार निर्भरता कार्य मॉडल है। प्रत्येक कार्य केवल निर्भरता ग्राफ में सभी संक्रमणीय पूर्वापेक्षाओं को ध्यान में रखते हुए दिए गए निर्माण में एक बार चलाया जाता है। केक सिंटैक्स में Martin Fowler's article on rake से एक उदाहरण दिया गया है, जो सीधे आपके प्रोजेक्ट.क्लोज में जाता है। code_gen.clj, compile.clj, data_load.clj, और my_test.clj:

(deftask code-gen 
    "This task generates code. It has no dependencies." 
    (println "generating code...") 
    ...) 

(deftask compile #{code-gen} 
    "This task does the compilation. It depends on code-gen." 
    (println "compiling...") 
    ...) 

(deftask data-load #{code-gen} 
    "This task loads the test data. It depends on code-gen." 
    (println "loading test data...") 
    ...) 

(deftask test #{compile data-load} 
    "This task runs the tests. It depends on compile and data-load." 
    (println "running tests...") 
    ...) 

Leiningen में भी ऐसा ही करने के लिए आपको पहले 4 फाइलों के साथ अपनी परियोजना में एक leiningen निर्देशिका बनाना होगा।

src/leiningen/code_gen.clj

(ns leiningen.code-gen 
    "This task generates code. It has no dependencies.") 

(defn code-gen [] 
    (println "generating code...")) 

src/leiningen/my_compile.clj

(ns leiningen.my-compile 
    "This task does the compilation. It depends on code-gen." 
    (:use [leiningen.code-gen])) 

(defn my-compile [] 
    (code-gen) 
    (println "compiling...")) 

src/leiningen/data_load।CLJ

(ns leiningen.data-load 
    "This task loads the test data. It depends on code-gen." 
    (:use [leiningen.code-gen])) 

(defn data-load [] 
    (code-gen) 
    (println "loading test data...")) 

src/leiningen/my_test.clj

(ns leiningen.my-test 
    "This task runs the tests. It depends on compile and data-load." 
    (:use [leiningen.my-compile] 
     [leiningen.data-load])) 

(defn my-test [] 
    (my-compile) 
    (data-load) 
    (println "running tests...")) 

एक उम्मीद होती है ...

generating code... 
compiling... 
loading test data... 
running tests... 

लेकिन दोनों डेटा लोड और मेरी-संकलन पर कोड पीढ़ी निर्भर करती है, अत: आपका वास्तविक ouput है ...

generating code... 
compiling... 
generating code... 
loading test data... 
running tests... 

यो यू कोड पीढ़ी memoize लिए इसे कई बार चलाया जा रहा से रोकने के लिए होगा:

(ns leiningen.code-gen 
    "This task generates code. It has no dependencies.") 

(def code-gen (memoize (fn [] 
         (println "generating code...")))) 

उत्पादन:

generating code... 
compiling... 
loading test data... 
running tests... 

कौन सा है कि हम क्या चाहते हैं।

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

लीन आपको एक कार्य के रूप में एक सादा कार्य देता है, लेकिन अतिरिक्त बाधा के साथ यह इसके नाम पर अपना नामस्थान होना चाहिए। यदि कोई कार्य इस पर निर्भर करता है, तो यह एक अलग नामस्थान में होगा, और इसे ns मैक्रो में दूसरे का उपयोग/आवश्यकता होगी। केक बनाता है तुलना में बहुत साफ और संक्षिप्त दिखता है।

एक और महत्वपूर्ण अंतर यह है कि कार्यों को कैसे जोड़ा जाता है। आइए मान लें कि हम my-test को jar कार्य में केक/लीन के निर्माण के लिए पूर्व शर्त के रूप में जोड़ना चाहते हैं। केक में, आप कार्य के रूपों और निर्भरताओं में शामिल होने के लिए deftask मैक्रो का उपयोग कर सकते हैं।

(deftask jar #{my-test}) 

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

(add-hook #'leiningen.jar/jar (fn [f & args] 
           (my-test) 
           (apply f args))) 

केक में वैश्विक परियोजना की धारणा भी है। आप उपयोगकर्ता विशिष्ट dev-dependencies, जैसे swank, ~/.cake/project.clj पर जोड़ सकते हैं और इसे अपनी सभी परियोजनाओं में रख सकते हैं। वैश्विक परियोजना का प्रयोग प्रयोग के लिए एक परियोजना के बाहर एक प्रतिलिपि शुरू करने के लिए भी किया जाता है। लीन ~/.lein/init.clj में प्रति-उपयोगकर्ता कॉन्फ़िगरेशन का समर्थन करके और ~/.lein/plugins में वैश्विक प्लगइन का समर्थन करके समान सुविधाएं लागू करता है। आम तौर पर, लीन के पास केक की तुलना में एक बहुत ही समृद्ध प्लगइन पारिस्थितिक तंत्र है, लेकिन केक में बॉक्स (युद्ध, तैनाती, जावा संकलन, मूल निर्भरता, क्लोजर, और झुकाव) से अधिक कार्य शामिल हैं। क्लोजर भी जांच के लायक हो सकता है, यह अनिवार्य रूप से एक पैकेज प्रबंधक के साथ एक वैश्विक परियोजना है, लेकिन निर्माण क्षमताओं के बिना (मुझे इसके साथ कोई अनुभव नहीं है)।

असली अपरिवर्तनीय अंतर कार्य परिभाषा है, क्योंकि टेक्नॉन्सी ने बताया। मेरी (पक्षपातपूर्ण) राय में, केक कार्यों को बेहतर तरीके से संभालता है। एक कार्य निर्भरता मॉडल की आवश्यकता स्पष्ट हो गई जब हमने लीन के साथ हमारे प्रोजेक्ट में प्रोटोकॉल बफर का उपयोग शुरू किया। Protobufs हमारे सभी कार्यों के लिए पूर्व-आवश्यकताएं थीं, फिर भी उन्हें संकलित करना वास्तव में धीमा है। हमारे पास अंतर-निर्भर कार्यों का भी बहुत कुछ है, इसलिए कोई भी निर्माण दर्दनाक था। मुझे अलग-अलग नामस्थान की आवश्यकता पसंद नहीं है, और इसलिए मेरे द्वारा बनाए गए प्रत्येक कार्य के लिए एक अतिरिक्त src फ़ाइल।डेवलपर्स बहुत सारे कार्य बनाते हैं, लीन का दृष्टिकोण बहुत अधिक घर्षण बनाकर इसे हतोत्साहित करता है। केक के साथ, आप project.clj के भीतर केवल डेफटास्क मैक्रो का उपयोग कर सकते हैं।

केक अभी भी युवा है, और एक काम प्रगति पर है, लेकिन यह एक बहुत ही सक्रिय परियोजना है।

+0

ठीक है, "लीन इंटरेक्टिव" भी है जो आपको प्रत्येक लीन कमांड के लिए जावा स्टार्टअप समय के ऊपरी हिस्से के बिना लगातार लीन चलाने देता है। – Marko

+1

चार-कार्य उदाहरण काफी प्रतिस्पर्धात्मक है। ऐसा करने में ऐसा तरीका होता है क्योंकि बनाने में फ़ंक्शन नहीं होते हैं, इसलिए सब कुछ एक कार्य होना चाहिए। लेकिन आप वास्तव में Leiningen के साथ अपने कार्यों को तोड़ नहीं होगा; यह सिर्फ समझ में नहीं आता है। आप उन कार्यों को कभी नहीं देखते हैं जो कम हैं; अभ्यास में उस कार्य के नामस्थान में हमेशा कम से कम 2 या 3 समर्थन फ़ंक्शन होते हैं। – technomancy

+0

रॉबर्ट हुक के लिए एकजुटता आपत्ति भी बहुत मूर्ख है; मैंने केक निर्भरताओं को करने के लिए चार लाइनों में एक प्रीपेड मैक्रो लागू किया। इसके बारे में सबसे कठिन हिस्सा मैक्रो के लिए एक नाम चुन रहा था। – technomancy

7

2011-11-15 के रूप में, के cake and lein merge

+0

क्लोजर-केक समूह स्पष्ट रूप से हटा दिया गया था। एक और घोषणा लिंक अभी भी जीवित है: https://groups.google.com/forum/#!topic/leiningen/WnnQIZipG5E – Joanis

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