13

是否有必要更改 SBT 及其插件使用的 Scala 版本?

我正在使用 Play Framework 2.1.1-RC2。我想创建将使用 Scala 2.10.1 的新项目。为了实现这一点,我做了以下

  • "org.scala-lang" % "scala-compiler" % "2.10.1"增加了依赖Build.scala
  • 将变量初始化scalaVersion为 2.10.1 inBuild.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。我该如何改变呢?它会影响将用于编译我的代码的版本吗?

更新:看起来这种更改编译器版本的方式无法正常工作。运行我的应用程序后,我在游戏控制台中收到以下警告:

[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
4

2 回答 2

13

SBT 是一个 Scala 应用程序,和所有 Scala 应用程序一样,它需要遵守 Scala 的二进制兼容性规则。具体来说,版本 2.8、2.9 和 2.10 彼此不兼容。

这意味着,因为 Play 使用的 SBT 版本是使用 Scala 2.9.2 编译的,所以所有插件和所有项目定义都必须使用另一个 2.9.x 版本编译。这是因为你Build.scala不是简单地由 SBT 执行的东西,它成为SBT 执行的一部分。

但是,这与您的应用程序应该使用什么版本的 Scala 编译有关。SBT 可以使用任何 Scala 版本,甚至可以同时生成多个 Scala 版本——这就是 Scala 库设法为多个 Scala 版本提供二进制文件的方式。

于 2013-03-28T05:18:31.300 回答
11

我实验的最终目标是更改用于构建我的项目的 Scala 编译器的版本。

经过多次尝试,我得出结论,实现它是不可能的。我认为这是 Play Framework 的创建者应该解决的问题。

scalaVersion在 Build.scala中设置2.10.1-local并没有多大帮助。SBT 似乎要去 Maven/Ivy 并下载我不想要的 2.10.0 片段。编译应用程序后,我收到一堆关于不兼容依赖项的警告。

我认为这是因为{PLAY_HOME}\framework\project\Build.scala将一堆变量设置为 2.10.0。

“优雅”的解决方案是告诉 SBT 我将通过在 Build.scala 中设置以下变量来使用 Scala 的本地副本

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

但是,如果我使用play idea命令创建 IntelliJ IDEA 配置,则结果项目需要一些清理,特别是:

  • Scala 方面引用缺少Scala 2.10.0的库。
  • 模块 test3-build 依赖于缺少的Scala 2.9.2

我希望我的实验其他也在学习 Play 和 Scala 的人。

详细信息在这里:http ://www.scala-sbt.org/release/docs/Howto/scala.html

于 2013-03-28T05:43:13.963 回答