Подтвердить что ты не робот

Как я могу изменить версию Scala, которая используется Play, SBT и его плагинами?

Нужно ли менять версию Scala, которая используется SBT и ее плагинами?

Я использую Play Framework 2.1.1-RC2. Я хочу создать новый проект, который будет использовать Scala 2.10.1. Чтобы добиться этого, я сделал следующее

  • добавлена ​​зависимость "org.scala-lang" % "scala-compiler" % "2.10.1" в Build.scala
  • инициализированная переменная scalaVersion - 2.10.1 в Build.scala

Затем я запустил команду play about и получил следующий вывод

[test2] $ about
Getting Scala 2.10.1 ...
downloading http://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.10.1/scala-compiler-2.10.1.jar ...
        [SUCCESSFUL ] org.scala-lang#scala-compiler;2.10.1!scala-compiler.jar (7401ms)
downloading http://repo1.maven.org/maven2/org/scala-lang/scala-library/2.10.1/scala-library-2.10.1.jar ...
        [SUCCESSFUL ] org.scala-lang#scala-library;2.10.1!scala-library.jar (4309ms)
downloading http://repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.10.1/scala-reflect-2.10.1.jar ...
        [SUCCESSFUL ] org.scala-lang#scala-reflect;2.10.1!scala-reflect.jar (2144ms)
downloading http://repo1.maven.org/maven2/org/scala-lang/jline/2.10.1/jline-2.10.1.jar ...
        [SUCCESSFUL ] org.scala-lang#jline;2.10.1!jline.jar (201ms)
:: retrieving :: org.scala-sbt#boot-scala
        confs: [default]
        5 artifacts copied, 0 already retrieved (24386kB/58ms)
[info] This is sbt 0.12.2
[info] The current project is {file:/C:/work/test_projects/test2/}test2
[info] The current project is built against Scala 2.10.1
[info] Available Plugins: play.Project, sbt.PlayProject, com.typesafe.sbteclipse.plugin.EclipsePlugin, com.typesafe.sbtidea.SbtIdeaPlugin
[info] sbt, sbt plugins, and build definitions are using Scala 2.9.2

Последняя строка касается меня. В нем говорится, что используется Scala 2.9.2. Как я могу это изменить? Будет ли это влиять на то, какая версия будет использоваться для компиляции кода my?

Обновление: Похоже, этот способ изменения версии компилятора не работал должным образом. После запуска моего приложения у меня есть следующие предупреждения в консоли воспроизведения:

[warn] Potentially incompatible versions of dependencies of {file:/C:/work/test_projects/test2/}test2:
[warn]    org.scala-lang: 2.10.1, 2.10.0
[info] Compiling 5 Scala sources and 1 Java source to C:\work\test_projects\test2\target\scala-2.10\classes...
[info] 'compiler-interface' not yet compiled for Scala 2.10.1. Compiling...
[info]   Compilation completed in 8.608 s
[warn] Potentially incompatible versions of dependencies of {file:/C:/work/test_projects/test2/}test2:
[warn]    org.scala-lang: 2.10.1, 2.10.0
[info] play - Application started (Dev)
[warn] Potentially incompatible versions of dependencies of {file:/C:/work/test_projects/test2/}test2:
[warn]    org.scala-lang: 2.10.1, 2.10.0
4b9b3361

Ответ 1

SBT - это приложение Scala, и, как и все приложения Scala, он должен соблюдать правила совместимости двоичных файлов Scala. В частности, версии 2.8, 2.9 и 2.10 несовместимы друг с другом.

Это означает, что, поскольку версия SBT, используемая Play, была скомпилирована с помощью Scala 2.9.2, то все плагины и все определения проекта должны быть скомпилированы с другой версией 2.9.x. Это потому, что ваш Build.scala не является чем-то, что просто выполняется SBT, оно становится частью исполнения SBT.

Однако это имеет отношение к какой версии Scala необходимо скомпилировать ваше приложение. SBT может использовать любую версию Scala и может даже выпускать несколько версий Scala в одно и то же время - так как библиотеки Scala могут предоставлять двоичные файлы для нескольких версий Scala.

Ответ 2

Конечной целью моих экспериментов было изменение версии компилятора Scala, используемого для создания моего проекта.

После нескольких попыток я пришел к выводу, что достижение этого не представляется возможным. Я думаю, что нужно что-то создавать разработчикам Play Framework.

Настройка scalaVersion - 2.10.1-local в Build.scala не помогла. SBT, похоже, собирается в Maven/Ivy и загружает куски 2.10.0, которые я не хочу. После компиляции приложения я получаю кучу предупреждений о несовместимых зависимостях.

Я думаю, это происходит потому, что {PLAY_HOME}\framework\project\Build.scala имеет набор переменных, равный 2.10.0.

"Элегантное" решение состояло в том, чтобы сказать SBT. Я собираюсь использовать локальную копию Scala, установив следующие переменные в Build.scala

scalaVersion := "2.10.1-local",
autoScalaLibrary := false,
scalaHome := Some(file("/Program Files (x86)/scala/"))

Но если я создаю конфигурацию IntelliJ IDEA с командой play idea, то в результате проект нуждается в некоторой очистке, в частности:

  • Scala отсутствуют ссылки на грань Scala 2.10.0.
  • Модуль test3-build имеет зависимость от отсутствующей библиотеки Scala 2.9.2

Надеюсь, мои эксперименты с другими людьми, которые также изучают Play и Scala.

Подробности здесь: http://www.scala-sbt.org/release/docs/Howto/scala.html