2014-12-30 6 views
6

Wenn ich mit Scala 2.10 und SBT 0.13.2 baue, möchte ich -language:_ haben, was aber von Scala 2.9 nicht erkannt wird. Es gibt eine Frage über die Einstellungen scalacOptions für Cross-Compilation (Conditional scalacOptions with SBT), aber es ist über build.sbt. Ich benutze Build.scala, weil ich einen Multiprojektbau mache.Wie setzt man verschiedene scalacOptions pro Scala-Version beim Cross-Compilieren mit Build.scala?

Ich habe dies versucht:

def scalacOptionsVersion(v: String) = { 
    Seq(
     "-unchecked", 
     "-deprecation", 
     "-Xlint", 
     "-Xfatal-warnings", 
     "-Ywarn-dead-code", 
     "-target:jvm-1.7", 
     "-encoding", "UTF-8") ++ (
    if (v.startsWith("2.9")) Seq() else Seq("-language:_")) 
    } 

    override val settings = super.settings ++ Seq(
    ..., 
    scalaVersion := "2.10.4", 
    scalacOptions <++= scalaVersion(scalacOptionsVersion), 
    crossScalaVersions := Seq("2.9.2", "2.10.4", "2.11.4"), 
    ... 
) 

aber ich erhalte eine Fehlermeldung:

[error] /Users/benwing/devel/lemkit/scala/project/build.scala:29: type mismatch; 
[error] found : sbt.Def.Initialize[Equals] 
[error] required: sbt.Def.Initialize[sbt.Task[?]] 
[error] Note: Equals >: sbt.Task[?], but trait Initialize is invariant in type T. 
[error] You may wish to define T as -T instead. (SLS 4.5) 
[error]  scalacOptions <++= scalaVersion(scalacOptionsVersion), 
[error]         ^
[error] one error found 

Hilfe?

+0

Welche Version von sbt? – monkjack

+0

Mein Projekt ist für 0.13.2 ausgelegt. Vielleicht gibt es eine Möglichkeit, Multiprojekt-Builds mit 'build.sbt' durchzuführen, aber ich weiß nicht, wie und wie es aussieht, sollte die Antwort kein Umschalten des gesamten Build-Skripts erfordern. –

+0

Gerade inklusive SBT-Version in Frage. –

Antwort

10

In SBT 0.13+ dies funktionieren wird:

def scalacOptionsVersion(scalaVersion: String) = { 
    Seq(
    "-unchecked", 
    "-deprecation", 
    "-Xlint", 
    "-Xfatal-warnings", 
    "-Ywarn-dead-code", 
    "-target:jvm-1.7", 
    "-encoding", "UTF-8" 
) ++ CrossVersion.partialVersion(scalaVersion) match { 
     case Some((2, scalaMajor)) if scalaMajor == 9 => Nil 
     case _ => Seq("-language:_") 
     } 
} 


val appSettings = Seq(
    scalacOptions := scalacOptionsVersion(scalaVersion.value) 

    // other settings... 
) 
+0

Wow, wir benutzen tatsächlich sbt-scoverage! Zumindest waren wir für dieses Projekt, aber ich musste es für die 2.9 Cross-Compilation kommentieren. Irgendeine Idee, wie man dieses Problem bearbeitet, oder unterstützt sbt-scoverage einfach nicht 2.9? –

+0

Das sbt-Plugin unterstützt 0.13+, das scoverage scalac-Plugin unterstützt nur 2.11 (und funktioniert meistens auf 2.10, wird aber offiziell nicht unterstützt). In der Version 1.0+, aktivieren Sie es über die Befehlszeile, also nicht sicher, wie Sie selektiv aktivieren, lassen Sie mich nachdenken. – monkjack

+0

Danke! Wie Sie vielleicht vermutet haben, verwende ich sbt-scoverage 0.x (speziell 0.99.7.1); auch sbt-overalls 0.99.0. Diese werden mit 'addSbtPlugin' hinzugefügt. –