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