2016-05-27 15 views
2

Also, ich habe ein SBT-Projekt mit den Modulen A und B.Wenn ich ein SBT Multiprojekt Build haben, wie kann ich A-Test Abhängigkeiten nicht in zu B-Tests Leck

  • A auf B hängt
  • Die normalen Projektpakete von A und B sind kompatibel.
  • A hat ein Paket zum Testen, das mit einem Paket inkompatibel ist, das B für Tests verwendet.
  • A hängt nicht von B-Test-Pakete
  • A die Tests fehlschlagen, weil der Testpaket Inkompatibilität

In meinen Augen ist dieser Fehler ungültig ist, weil A der Tests hängt nicht von B-Tests.

I

A.dependsOn(B % "compile->compile;test->compile") 

Bedeutung

  • A der Kompilierung bin mit hängt von B kompilieren
  • A-Test auf B Kompilierung abhängt.

Mache ich etwas falsch?

Here's the actual build file. Relevantes Projekt ist doobieSupport23 abhängig von core

Here's the build error. Sie können sehen, dass es in scalaz 7.2 in den Build zieht, aber es sollte nur ziehen Scalaz 7.1.6

+0

Ich bekomme nicht von Ihrem Fragetitel, scheitern die Tests von B oder versagen die Tests von A? – Sergey

+0

Tut mir leid, ich habe mehr Details hinzugefügt. A's Tests scheitern. – JBarber

+0

Über das Abhängigkeitsdiagramm Schritt für Schritt konnte ich herausfinden, dass ich einige nicht notwendige Abhängigkeiten in Paketen hatte, die dies verursachten. – JBarber

Antwort

0

Was ich in der Ausgabe angegeben hatte, funktioniert genauso wie erwartet.

Das Problem endete damit, dass meine Build-Datei eine Fremdabhängigkeit hatte, die ich gerade beschönigt hatte. Diese Abhängigkeit verursachte Doobie 3.0, wo ich nur Doobie 2.3 erwartet hatte.

0

Das Problem ist definitiv nicht in Projekten abhängig voneinander, die Konfiguration "compile->compile;test->compile", wie es mir scheint, ist perfekt für das, was Sie erreichen müssen.

Was das Problem verursacht, ist, dass Ihre libraryDependencies geteilt werden, weil A von B abhängig ist. Glücklicherweise ermöglicht sbt, Abhängigkeiten ziemlich genau zu verwalten.

Der einfachste Vorschlag wäre, eine neuere Version der in Konflikt stehenden Abhängigkeit auf einen Bereich so eng wie möglich anzuwenden - das heißt, wenn scalaz 7.2.0 nur in Tests des Kerns benötigt wird, also sei es!

lazy val core = project(...) 
    .settings(libraryDependencies in Test += "org.scalaz" %% "scalaz" % "7.2.0") 
lazy val doobieSupport23 = project(...).dependsOn(core) 
    .settings(libraryDependencies in Test += "org.scalaz" %% "scalaz" % "7.1.6") 

Wenn Sie nicht es funktioniert, weil die neuere Version tatsächlich in anderen Kern die Abhängigkeiten verwendet wird, kann der folgende Trick es tun:

val scalazOld = "org.scalaz" %% "scalaz" % "7.1.6" 
val scalazNew = "org.scalaz" %% "scalaz" % "7.2.0" 

lazy val core = project(...) 
    .settings(libraryDependencies += "org.scalaz" %% "scalaz" % "7.2.0") 

lazy val doobieSupport23 = project(...).dependsOn(core) 
    .settings(
    libraryDependencies in Test += "org.scalaz" %% "scalaz" % "7.1.6" force() 
) 

Notiere die force() combinator. Ich bin mir nicht sicher, dass es auf Grund von inkompatiblen Klassen im Klassenpfad nicht zur Laufzeit ausfallen wird.

+0

hm, komisch. Ich dachte, dass "...%" test "dies erreichen sollte. Ich werde es ausprobieren und sehen, was passiert. Danke für den Tipp! – JBarber

+0

Dies scheint immer noch nicht zu beheben. – JBarber

+0

Das Problem scheint tatsächlich zu sein, dass "doobie 2.3" von "doobie 3.0" vertrieben wird – JBarber