2013-03-22 4 views
11

में कुछ/सभी मॉड्यूल से कुछ ट्रांजिटिव निर्भरताओं को बहिष्कृत करें मेरे पास एक ग्रेलेस फ्रंट एंड के साथ एक बड़ी विरासत जावा एप्लिकेशन है, और मैं Grails front end को एक नए लिखित के साथ बदलने पर काम कर रहा हूं खेल में। विरासत जावा में कुछ (मेवेन) मॉड्यूल निर्भरता समस्याग्रस्त/विरोधाभासी चीजें लाती हैं। सभी विरासत जावा निर्भरताओं को सॉर्ट करना वास्तव में इस बिंदु पर एक विकल्प नहीं है, इसलिए मैं केवल उन ट्रांज़िटिव निर्भरताओं को बाहर करना चाहता हूं जिन्हें मैं पसंद नहीं करता हूं।प्ले 2.0/एसबीटी: Build.scala

में Grails BuildConfig.groovy, मैं बहिष्करण सूची परिभाषित कर सकते हैं:

def some_bad_things = [ 
     [group: 'some-evil-group'], 
     [name: 'some-evil-module-from-another-group'], 
     [name: 'some-other-evil-module'] 
] 

और फिर सीधे निर्भरता की एक पूरी ब्लॉक के लिए इसका इस्तेमाल करते हैं:

dependencies { 
    compile (
     [group: 'com.foo', name: 'foo-module1', version: '1.0'], 
     // ... 20 or 30 modules ... 
     [group: 'com.quux', name: 'quux-module42', version: '7.2'], 
    ) { 
     excludes some_bad_things 
    } 
} 

यह स्पष्ट नहीं क्या Build.scala वाक्य रचना है एक ही काम करने के लिए। वास्तविक निर्भरताओं का अनुवाद करना बहुत सरल है ...

val appDependencies = Seq(
    "com.foo" % "foo-module1" % "1.0" % "compile", 
    // ... 20 or 30 modules ... 
    "com.quux" % "quux-module42" % "7.2" % "compile" 
) 

... लेकिन बहिष्करण नहीं हैं; जैसे मैं व्यक्तिगत रूप से सब कुछ निकालने की ज़रूरत यह लग रहा है:

val appDependencies = Seq(
    ("com.foo" % "foo-module1" % "1.0" % "compile"), 
     .exclude("some-evil-group", "evil-module-1") 
     .exclude("some-evil-group", "evil-module-2") 
     .exclude("mostly-ok-group-1", "some-evil-module-from-another-group") 
     .exclude("mostly-ok-group-2", "some-other-evil-module"), 

    // ... 20 or 30 modules, each with four excludes ... 

    ("com.quux" % "quux-module42" % "7.2" % "compile") 
     .exclude("some-evil-group", "evil-module-1") 
     .exclude("some-evil-group", "evil-module-2") 
     .exclude("mostly-ok-group-1", "some-evil-module-from-another-group") 
     .exclude("mostly-ok-group-2", "some-other-evil-module") 

) 

मुझे लगता है वहाँ रॉकेट विज्ञान का एक बहुत यहाँ चल रहा नहीं है, और यहां तक ​​कि अगर वहाँ बॉक्स रास्ते से कोई बाहर है विश्व स्तर पर बाहर करते हैं, ऐसा नहीं होना चाहिए कुछ सहायक समारोह, या कुछ लिखना मुश्किल हो, जो मेरे लिए यह करेगा। लेकिन मैं एक स्कैला नौसिखिया हूं और यह मेरे लिए भी स्पष्ट नहीं है कि मैं किस प्रकार देख रहा हूं या सभी ऑपरेटर क्या करते हैं, या मैं जो देख रहा हूं वह सादा स्कैला/एसबीटी है और प्ले-विशिष्ट कितना है। तो, सुझावों का स्वागत है?

उत्तर

15

एक देर से जवाब सा लेकिन, आप इस प्रकार की सूची में प्रत्येक निर्भरता को बाहर निकालने के लागू होने वाला एक फिल्टर लिख सकते हैं:

def excludeFromAll(items: Seq[ModuleID], group: String, artifact: String) = 
    items.map(_.exclude(group, artifact)) 

और उसके बाद का उपयोग करें कि आपकी निर्भरता फिल्टर करने के लिए:

val deps = Seq(dependencies) 
val appDependencies = excludeFromAll(deps, "groupId", "artifactId") 

या यदि आप नियमित रूप से एसबीटी सामान की तरह अधिक धाराप्रवाह वाक्यविन्यास प्राप्त करना चाहते हैं, लेकिन थोड़ी अधिक उन्नत स्कैला कोड (संपादित करें: मूल रूप से इसे स्कैला 2.10 निहित वर्ग के साथ लिखा गया है):

implicit def dependencyFilterer(deps: Seq[ModuleID]) = new Object { 
    def excluding(group: String, artifactId: String) = 
    deps.map(_.exclude(group, artifactId)) 
} 

जो बदले में आप इस

val appDependencies = Seq(...).excluding("groupId", "artifactId") 

मुझे लगता है कि आप पाठक के लिए एक व्यायाम के रूप जरूरत सकर्मक deps की एक सूची को बाहर जा रहा हूँ की तरह अपने निर्भरता घोषित करने के लिए जोड़ सकेगा, बहुत कठिन नहीं होना चाहिए इन उदाहरणों को देखते हुए, आशा है कि इससे मदद मिलेगी!

1

मुझे लगता है कि यह आसान है जैसे कि यह एसबीटी दस्तावेज़ बताता है: http://www.scala-sbt.org/0.12.2/docs/Detailed-Topics/Library-Management.html

libDependencies += "com.quux" % "quux-module42" % "7.2" % "compile" intransitive() 

इस विधि का समस्या यह है कि आप किसी दिए गए विरूपण साक्ष्य के सभी निर्भरता को बाहर है।

+0

मामलों में जहां सभी उप-निर्भरता वैकल्पिक हैं में अब तक का सबसे सुरुचिपूर्ण समाधान द्वारा होती है। जैसे यह http: //x-stream.github हल किया गया।मेरे लिए io/समावेशन जो क्लास-डुप्लिकेट के साथ अन्यथा संघर्ष करता है। –

12

बस एसबीटी 0.13 में पाया है, हम इसे नीचे दिए गए कोड के माध्यम से बस कर सकता है:

excludeDependencies ++= Seq(
    SbtExclusionRule("com.google.gwt", "gwt-user"), 
    SbtExclusionRule("com.google.gwt", "gwt-dev"), 
    SbtExclusionRule("com.google.gwt", "gwt-servlet"), 
    SbtExclusionRule("com.google.guava", "guava-gwt") 
) 
+0

यह वही समस्या थी जो मुझे किसी समस्या के लिए जरूरी था जिसे मैं हफ्तों तक संघर्ष कर रहा था! धन्यवाद! – Hrishi

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