2014-10-21 5 views
13

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

lazy val module = sbt.Project(...) dependsOn (foo, bar) aggregate (foo, bar) 

या बस ...

lazy val module = sbt.Project(...) dependsOn (foo, bar) 

मैं एसबीटी 0.13.6 उपयोग कर रहा हूँ

उत्तर

11

tl; डॉaggregate का कारण बनता है कार्यों और योग के मॉड्यूल में निष्पादित किए जाने वाले सभी aggregate घ एक जबकि dependsOn एक क्लासस्पैट निर्भरता सेट करता है ताकि पुस्तकालय aggregate आईएनजी मॉड्यूल के लिए दृश्यमान हों (compile उर्फ ​​पर कॉन्फ़िगरेशन के आधार पर उदाहरण में)।

मतभेदों का प्रदर्शन करने के लिए एक नमूना।

मैं निम्नलिखित build.sbt (कुछ भी नहीं वाकई दिलचस्प) का उपयोग कर रहा:

lazy val a = project 

lazy val b = project 

lazy val c = project dependsOn b aggregate (a,b) 

निर्माण तीन मॉड्यूल a, b, और पिछले c परियोजना के साथ ca और b के लिए एक समेकित होने की परिभाषित करता है। चौथा मॉड्यूल है - एक अंतर्निहित - जो सभी मॉड्यूल a, b, और c समेकित करता है।

> projects 
[info] In file:/Users/jacek/sandbox/aggregate-dependsOn/ 
[info]  a 
[info] * aggregate-dependson 
[info]  b 
[info]  c 

जब मैं एक aggreate ing मॉड्यूल में एक कार्य निष्पादित, कार्य aggregate घ मॉड्यूल में क्रियान्वित किया जा रहा है।

> compile 
[info] Updating {file:/Users/jacek/sandbox/aggregate-dependsOn/}b... 
[info] Updating {file:/Users/jacek/sandbox/aggregate-dependsOn/}a... 
[info] Updating {file:/Users/jacek/sandbox/aggregate-dependsOn/}aggregate-dependson... 
[info] Resolving org.fusesource.jansi#jansi;1.4 ... 
[info] Done updating. 
[info] Resolving org.fusesource.jansi#jansi;1.4 ... 
[info] Done updating. 
[info] Resolving org.fusesource.jansi#jansi;1.4 ... 
[info] Done updating. 
[info] Updating {file:/Users/jacek/sandbox/aggregate-dependsOn/}c... 
[info] Resolving org.fusesource.jansi#jansi;1.4 ... 
[info] Done updating. 
[success] Total time: 0 s, completed Oct 22, 2014 9:33:20 AM 

एक ही होता है जब मुझे लगता है कि बदले में होगा यह a और b के खिलाफ निष्पादित, लेकिन उच्च-स्तरीय परियोजना में नहीं c में एक कार्य निष्पादित।

> show c/clean 
[info] a/*:clean 
[info] () 
[info] b/*:clean 
[info] () 
[info] c/*:clean 
[info] () 
[success] Total time: 0 s, completed Oct 22, 2014 9:34:26 AM 

किसी कार्य के a या b में मार डाला है, यह केवल परियोजना के भीतर चलता है।

> show a/clean 
[info]() 
[success] Total time: 0 s, completed Oct 22, 2014 9:34:43 AM 

होना या न होना एक कार्य aggregate ing परियोजनाओं aggregate कुंजी द्वारा नियंत्रित किया जाता में निष्पादित किया जाता है एक परियोजना और/या कार्य के दायरे वाला।

> show aggregate 
[info] a/*:aggregate 
[info] true 
[info] b/*:aggregate 
[info] true 
[info] c/*:aggregate 
[info] true 
[info] aggregate-dependson/*:aggregate 
[info] true 

बदलें यह Aggregation में वर्णित हैं:

परियोजना में एकीकृत करने वाला कर रही है, इस मामले में जड़ परियोजना, आप प्रति-कार्य एकत्रीकरण नियंत्रित कर सकते हैं। (...) aggregate in अपडेट अद्यतन कार्य के लिए कुल कुंजी है।

नीचे मैं c मॉड्यूल और clean कार्य तो clean नहीं रह गया है aggregate घ मॉड्यूल a और b में निष्पादित किया जाता है के लिए महत्वपूर्ण बदल रहा हूँ: c के लिए

> set aggregate in (c, clean) := false 
[info] Defining c/*:clean::aggregate 
[info] The new value will be used by no settings or tasks. 
[info] Reapplying settings... 
[info] Set current project to aggregate-dependson (in build file:/Users/jacek/sandbox/aggregate-dependsOn/) 
> show c/clean 
[info]() 
[success] Total time: 0 s, completed Oct 22, 2014 9:39:13 AM 

अन्य कार्यों अप्रभावित रहे हैं और अभी भी निष्पादित c में एक कार्य इसे aggregate मॉड्यूल में चलाएगा:

> show c/libraryDependencies 
[info] a/*:libraryDependencies 
[info] List(org.scala-lang:scala-library:2.10.4) 
[info] b/*:libraryDependencies 
[info] List(org.scala-lang:scala-library:2.10.4) 
[info] c/*:libraryDependencies 
[info] List(org.scala-lang:scala-library:2.10.4) 

जबकि aggregate एसबीटी कार्यों के लिए एक निर्भरता सेट ताकि वे अन्य aggregate घ मॉड्यूल में निष्पादित हो, dependsOn एक CLASSPATH निर्भरता, यानी dependsOn एड मॉड्यूल में एक कोड दिख रहा है सेट dependsOn एक ("नया" शब्द के लिए खेद है) ing में ।

मान लेते हैं b इस प्रकार एक मुख्य उद्देश्य है दो:

object Hello extends App { 
    println("Hello from B") 
} 

सहेजें b/hello.scala करने के लिए Hello वस्तु है, यानी b मॉड्यूल के तहत।

c के बाद से dependsOn b को परिभाषित किया गया था (ऊपर build.sbt देखें), Hello वस्तु b में दिख रहा है (क्योंकि यह मॉड्यूल के अंतर्गत आता है), लेकिन यह भी c में।

> b/run 
[info] Running Hello 
Hello from B 
[success] Total time: 0 s, completed Oct 22, 2014 9:46:44 AM 
> c/runMain Hello 
[info] Running Hello 
Hello from B 
[success] Total time: 0 s, completed Oct 22, 2014 9:46:58 AM 

(मैं अकेला run रूप c में runMain उपयोग करने के लिए वर्ग है कि मैं व्याख्या नहीं कर सकते नहीं देख सकता था था)।

a में काम चलाने के लिए कोशिश कर रहा java.lang.ClassNotFoundException: Hello साथ समाप्त होता है के बाद से वर्ग मॉड्यूल में दिखाई नहीं है।

> a/runMain Hello 
[info] Updating {file:/Users/jacek/sandbox/aggregate-dependsOn/}a... 
[info] Resolving org.fusesource.jansi#jansi;1.4 ... 
[info] Done updating. 
[info] Running Hello 
[error] (run-main-6) java.lang.ClassNotFoundException: Hello 
java.lang.ClassNotFoundException: Hello 
    at java.lang.ClassLoader.findClass(ClassLoader.java:530) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
[trace] Stack trace suppressed: run last a/compile:runMain for the full output. 
java.lang.RuntimeException: Nonzero exit code: 1 
    at scala.sys.package$.error(package.scala:27) 
[trace] Stack trace suppressed: run last a/compile:runMain for the full output. 
[error] (a/compile:runMain) Nonzero exit code: 1 
[error] Total time: 0 s, completed Oct 22, 2014 9:48:15 AM 

build.sbt में dependsOn b करने के लिए a पुन: निर्धारित करें और अपवाद गायब हो जाती है।

आपको आधिकारिक दस्तावेज़ीकरण में Multi-project builds पढ़ना चाहिए।

+2

'निर्भर करता है' के लिए दस्तावेज़ के अनुसार: "यह उनको संकलित करते समय परियोजनाओं के बीच एक आदेश भी बनाता है; कोर को संकलित करने से पहले उपयोग को अद्यतन और संकलित किया जाना चाहिए।" क्या इसका मतलब यह निर्भर करता है कि प्रश्न में मॉड्यूल के लिए संकलन और अद्यतन कार्यों के लिए कुल योग का भी अर्थ है? या इसे 'कुल' का उपयोग करके अलग से व्यक्त किया जाना चाहिए? या कार्य निष्पादन के चयन के बजाय कार्य निष्पादन के आदेश पर कुल और निर्भरता के बीच व्यवहार में अंतर है? –

+3

एक बहुत ही रोचक अवलोकन - 'निर्भर करता है' निर्भर परियोजनाओं पर एक प्रकार का 'कुल' सेट करता है, लेकिन केवल उन कार्यों के लिए जो उनके जार उपलब्ध कराते हैं ताकि वे क्लासस्पैट पर उपलब्ध हो सकें। यह 'संकलन' का मामला है, लेकिन 'test' नहीं है जो केवल' संकलित 'निष्पादित करेगा यदि यह पहले नहीं किया गया था। –

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