2015-01-13 8 views
11

Ich habe ein Projekt mit Scala 2.10 und eins mit Scala 2.11. Sie sind auf ein gemeinsames Projekt angewiesen, das sich mit beiden kompilieren lässt.Wie funktioniert das SBT-Teilprojekt mit mehreren Scala-Versionen?

lazy val foo = (project in file("foo")).dependsOn(baz).settings(
    scalaVersion := "2.10.4" 
) 

lazy val bar = (project in file("bar")).dependsOn(baz).settings(
    scalaVersion := "2.11.4" 
) 

lazy val baz = (project in file("baz")).settings(
    crossScalaVersions := Seq("2.10.4", "2.11.4"), 
    scalaVersion := "2.10.4" 
) 

Und dann

$ sbt bar/update 
[info] Updating {file:/home/paul/Private/test/}bar... 
[info] Resolving baz#baz_2.11;0.1-SNAPSHOT ... 
[warn] module not found: baz#baz_2.11;0.1-SNAPSHOT 
[warn] ==== local: tried 
[warn] /home/paul/.ivy2/local/baz/baz_2.11/0.1-SNAPSHOT/ivys/ivy.xml 
[warn] ==== public: tried 
[warn] http://repo1.maven.org/maven2/baz/baz_2.11/0.1-SNAPSHOT/baz_2.11-0.1-SNAPSHOT.pom 
[info] Resolving jline#jline;2.12 ... 
[warn] :::::::::::::::::::::::::::::::::::::::::::::: 
[warn] ::   UNRESOLVED DEPENDENCIES   :: 
[warn] :::::::::::::::::::::::::::::::::::::::::::::: 
[warn] :: baz#baz_2.11;0.1-SNAPSHOT: not found 
[warn] :::::::::::::::::::::::::::::::::::::::::::::: 
[trace] Stack trace suppressed: run last bar/*:update for the full output. 
[error] (bar/*:update) sbt.ResolveException: unresolved dependency: baz#baz_2.11;0.1-SNAPSHOT: not found 
[error] Total time: 1 s, completed Jan 13, 2015 11:42:51 AM 

Wie kann ich baz nutzbar beiden Projekten?

+1

Haben Sie die Option 'crossPaths: = false' versucht, Scala-Versionen überhaupt zu ignorieren? –

+0

Es gibt eine Chance, dass Sie einige Vergleichbarkeitsprobleme (nicht 100%) haben, aber um ehrlich zu sein, riecht Ihre Situation sowieso schlecht; Ich würde dies als eine vorübergehende Lösung vorschlagen, bis Sie * foo * und * baz * 2.11.4 beide verwenden. –

Antwort

2

ich für dieses eine SBT plugin erstellt.

Projekt/plugins.sbt

resolvers += Resolver.sonatypeRepo("releases") 

addSbtPlugin("com.lucidchart" % "sbt-cross" % "1.0") 

build.sbt

lazy val foo = (project in file("foo")).dependsOn(baz_2_10).settings(
    scalaVersion := "2.10.4" 
) 

lazy val bar = (project in file("bar")).dependsOn(baz_2_11).settings(
    scalaVersion := "2.11.5" 
) 

lazy val baz = (project in file("baz")).cross 

lazy val baz_2_10 = baz("2.10.4") 

lazy val baz_2_11 = baz("2.11.5") 

Es dauert noch ein paar Zeilen, aber jetzt ist alles kompiliert wie erwartet: sbt foo/compile Werke und sbt bar/compile Werke .

Sie müssen eindeutige Befehle nicht erinnern, Sie haben keine Bugs aus crossPath := false, und im Gegensatz zu ++, ist dies parallelizable: sbt compilefoo kompilieren, bar und baz mit den richtigen Scala-Versionen gleichzeitig.

+0

Leider spielt es nicht gut mit Intellij, aber wenn lief von sbt - schnell und fantastisch. – Tvaroh

+0

Funktioniert OK mit IntellJ '2017.1.4' – Atais

+0

@Tvaroh Ich denke, es funktioniert auch mit Intellij oder besser als jede andere Lösung. Wenn Sie etwas anderes bemerken, geben Sie einen Fehler im Github-Projekt an. –

7

Yevgeniy Mordowkins vorgeschlagene Lösung, crossPaths := false im Baz-Projekt zu deklarieren, funktioniert.

Eine andere Sache, die Sie tun können, ist eine + vor dem Befehl voranstellen: sbt '+ bar/update'. Das wird baz für alle deklarierten Scala-Versionen aufbauen.

+0

Danke. ** (1) ** Werden 'crossPaths' Probleme verursachen, da Scala-Minor-Versionen nicht binärkompatibel sind? ** (2) ** Es scheint für '+' zu funktionieren, ich muss auch 'crossVersions' zu' bar' hinzufügen und Projekte mit 'project bar' wechseln und dann' + update' (statt '+ bar/update'), ansonsten 2.10. –

+0

@PaulDraper keine 'crossScalaVersions' zu' bar' hinzufügen. Was Sie tun müssen, ist die 'settings' vor der Deklaration von' dependsOn': 'lazy val bar = (Projekt in Datei (" bar ")). Settings (scalaVersion: =" 2.11.4 "). DependsOn (baz)' . –

+0

@PaulDraper können Sie 'update' ohne vorangestelltes' + 'innerhalb' bar' verwenden, solange Sie 'baz' für alle deklarierten Versionen bereits kompiliert haben. –

0

Ich hatte ein ähnliches Setup, und bekam es wie so funktionieren:

lazy val baz = (project in file("baz")).settings(
    crossScalaVersions := Seq("2.10.4", "2.11.4") 
) 
lazy val bar = (project in file("bar")).dependsOn(baz).settings(
    scalaVersion := "2.10.4" 
) 
lazy val foo = (project in file("foo")).dependsOn(baz).settings(
    scalaVersion := "2.11.4" 
) 

Und Gebäude mit

sbt '++ 2.10.4 baz/compile' 'bar/compile' '++ 2.11.4 baz/compile' 'foo/compile' 
Verwandte Themen