2013-03-22 8 views
11

Mam dużą starszą aplikację Java z interfejsem Grails i pracuję nad zastąpieniem przedniego końca Grails nową wersją w grze. Niektóre zależności modułu (Maven) w starszej wersji języka Java powodują problemy/konflikty. Sortowanie wszystkich starszych zależności Java nie jest w tej chwili opcją, więc chciałbym po prostu wykluczyć przejściowe zależności, które mi się nie podobają.Play 2.0/SBT: wykluczenie pewnych przejściowych zależności z niektórych/wszystkich modułów w Build.scala

w Grails BuildConfig.groovy mogę zdefiniować listę wykluczeń:

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

a następnie użyć go do całego bloku bezpośrednich zależności:

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

to nie jest oczywiste, co składnia Build.scala jest za zrobienie tego samego. Tłumaczenie rzeczywistych zależności jest dość proste ...

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

... ale wyłączenia nie są; wygląda na to, muszę wykluczyć wszystko indywidualnie:

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

) 

Zakładam, że nie ma dużo nauki rakiet tu dzieje, a nawet jeśli nie ma na uboczu skrzynki wykluczyć globalnie, nie powinno ciężko napisać jakąś funkcję pomocniczą lub coś, co zrobiłoby to za mnie. Jestem początkującym programistą Scala i nie jest nawet dla mnie oczywiste, na jakie typy patrzę, ani co robią operatorzy, ani jak wiele z tego, co widzę, to zwykła Scala/SBT i ile zależy od Play. Czy sugestie są mile widziane?

Odpowiedz

15

trochę późno odpowiedzi, ale można napisać filtr, który ma zastosowanie wykluczyć każdego uzależnienia w liście, jak to:

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

a następnie używać, aby filtrować zależności:

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

Lub jeśli chcesz uzyskać bardziej płynną składnię, bardziej jak zwykłe pliki sbt, ale z nieco bardziej zaawansowanym kodem Scala (edycja: oryginalnie napisała z niejawną klasą Scala 2.10):

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

co z kolei pozwoli Ci zadeklarować zależności jak tego

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

jestem pozostawiając wykluczyć listę dużą liczbą wykazywanych zależności przechodnich, że trzeba jako ćwiczenie dla czytelnika, nie powinno być zbyt trudne biorąc pod uwagę te przykłady, mam nadzieję, że to pomogło!

1

myślę, że łatwiej jak mówi 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() 

Problem z tej metody jest to, że wykluczenie wszystkich zależności danego artefaktu.

+0

to zdecydowanie najbardziej eleganckich rozwiązań w przypadkach, gdy wszystkie sub-Zależności są opcjonalne. Na przykład. rozwiązał http: //x-stream.gitub.io/włączenie dla mnie, które inaczej boryka się z duplikatami klasowymi. –

12

Wystarczy znaleźć w SBT 0.13, możemy po prostu zrobić to za pomocą poniższego kodu:

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

To była poprawka, której potrzebowałem w przypadku problemu, z którym borykałem się od tygodni! Dziękuję Ci! – Hrishi

Powiązane problemy