2013-03-22 21 views
11

Ho una grande applicazione legacy Java con un front end Grails, e sto lavorando alla sostituzione del front-end Grails con uno nuovo scritto in gioco. Alcune delle dipendenze del modulo (Maven) nella legacy Java portano in cose problematiche/in conflitto. Ordinare tutte le dipendenze Java legacy non è davvero un'opzione a questo punto, quindi mi piacerebbe solo escludere le dipendenze transitive che non mi piacciono.Play 2.0/SBT: Escludere alcune dipendenze transitive da alcuni/tutti i moduli in Build.scala

In Grails BuildConfig.groovy, posso definire un elenco di esclusioni:

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

e poi utilizzarlo per un intero blocco delle dipendenze dirette:

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 
    } 
} 

Non è evidente che cosa la sintassi Build.scala è per fare la stessa cosa La traduzione delle dipendenze attuali è piuttosto semplice ...

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

... ma le esclusioni non lo sono; sembra che devo escludere tutto individualmente:

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") 

) 

Presumo non c'è un sacco di scienza missilistica succedendo qui, e anche se non c'è di mezzo scatola di escludere a livello globale, non dovrebbe essere difficile da scrivere qualche funzione di aiuto, o qualcosa del genere, che lo farebbe per me. Ma io sono un principiante alla Scala e non mi sembra nemmeno ovvio quali tipi guardo o che cosa fanno tutti gli operatori, o quanto di quello che sto vedendo sia semplicemente Scala/SBT e quanto è specifico del Gioco. Quindi, i suggerimenti sono benvenuti?

risposta

15

Un po 'risposta in ritardo, ma, si potrebbe scrivere un filtro che applica la escludono per ogni dipendenza in una lista come questa:

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

e quindi utilizzare tale per filtrare le dipendenze:

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

O se vuoi ottenere una sintassi più fluente, più come le normali cose sbt, ma con un codice Scala un po 'più avanzato (edit: originariamente lo ha scritto con la classe implicita di Scala 2.10):

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

che a sua volta avrebbe permesso di dichiarare le dipendenze come questo

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

Sto lasciando l'escludere un elenco di dipendenze transitive che è necessario come un esercizio per il lettore, non dovrebbe essere troppo difficile dati questi esempi, spero che questo abbia aiutato!

1

penso che sia più facile, come racconta il doc SBT: http://www.scala-sbt.org/0.12.2/docs/Detailed-Topics/Library-Management.html

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

Il problema di questo metodo è che si escludono tutte le dipendenze di un determinato manufatto.

+0

che è di gran lunga i più eleganti soluzioni nei casi in cui tutti i sub-dipendenze sono opzionali. Per esempio. ha risolto http: //x-stream.github.io/inclusione per me che lotta con i duplicati di classe altrimenti. –

12

Appena trovato in SBT 0.13, potremmo semplicemente farlo tramite il codice qui sotto:

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

Questa era la correzione di cui avevo bisogno per un problema con cui avevo lottato per settimane! grazie! – Hrishi

Problemi correlati