Как установить разные scalacOptions для каждой версии Scala при кросс-компиляции с использованием Build.scala?

При сборке с использованием Scala 2.10 и SBT 0.13.2 я хочу иметь -language:_, но Scala 2.9 не распознает его. Есть вопрос о настройках разных scalacOptions для кросс-компиляции (условных scalacOptions с SBT), но это около build.sbt. Я использую Build.scala, потому что делаю многопроектную сборку.

Я пробовал это:

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

но я получаю сообщение об ошибке:

[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

Помощь?


person Urban Vagabond    schedule 30.12.2014    source источник
comment
Какая версия сбт?   -  person sksamuel    schedule 30.12.2014
comment
Мой проект рассчитан на 0.13.2. Возможно, есть способ выполнения многопроектных сборок с использованием build.sbt, но я не знаю, как это сделать, и кажется, что ответ не должен требовать переключения всего сценария сборки.   -  person Urban Vagabond    schedule 30.12.2014
comment
Просто включил рассматриваемую версию SBT.   -  person Urban Vagabond    schedule 30.12.2014


Ответы (1)


В SBT 0.13+ это будет работать:

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...
)
person sksamuel    schedule 30.12.2014
comment
Вау, мы на самом деле используем sbt-scoverage! По крайней мере, мы были за этот проект, но мне пришлось его закомментировать для кросс-компиляции 2.9. Есть идеи, как обойти эту проблему, или sbt-scoverage просто не поддерживает 2.9? - person Urban Vagabond; 30.12.2014
comment
Плагин sbt поддерживает 0.13+, плагин scalac scoverage поддерживает только 2.11 (и в основном работает на 2.10, но официально не поддерживается). В версии 1.0+ вы активируете его через командную строку, поэтому не знаете, как выборочно включить, дайте подумать. - person sksamuel; 30.12.2014
comment
Спасибо! Как вы могли догадаться, я использую sbt-scoverage 0.x (в частности, 0.99.7.1); также сбт-комбинезон 0.99.0. Они добавляются с помощью addSbtPlugin. - person Urban Vagabond; 30.12.2014