1. 配置和使用 Scala

配置和使用 Scala 

设置用于构建项目的 Scala 版本 

scalaVersion 配置用于编译的 Scala 版本。默认情况下,sbt 还添加了对具有此版本的 Scala 库的依赖关系。有关如何禁用此自动依赖关系,请参见下一节。如果未指定 Scala 版本,则使用构建 sbt 时所用的版本。建议明确指定 Scala 版本。

例如,要将 Scala 版本设置为“2.11.1”,

scalaVersion := "2.11.1"

禁用对 Scala 库的自动依赖关系 

sbt 默认情况下会添加对 Scala 标准库的依赖关系。要禁用此行为,请将 autoScalaLibrary 设置设置为 false。

autoScalaLibrary := false

临时切换到不同的 Scala 版本 

要在所有范围内将 Scala 版本设置为特定值,请使用 ++ 命令。例如,要临时使用 Scala 2.10.4,请运行

> ++ 2.10.4

使用本地 Scala 安装构建项目 

使用 Scala 主目录的路径定义 scalaHome 设置将使用该 Scala 安装。当使用本地 Scala 版本时,sbt 仍然需要设置 scalaVersion。例如,

scalaVersion := "2.10.0-local"

scalaHome := Some(file("/path/to/scala/home/"))

针对多个 Scala 版本构建项目 

请参见 交叉构建

在类路径上使用项目的依赖关系(但不使用已编译的项目类)进入 Scala REPL 

consoleQuick 操作检索依赖关系并将它们放在 Scala REPL 的类路径上。项目的源代码不会被编译,但任何源依赖关系的源代码都会被编译。要使用测试依赖关系进入 REPL,但不要编译测试源代码,请运行 Test/consoleQuick。这将强制编译主源代码。

在类路径上使用项目的依赖关系和已编译的代码进入 Scala REPL 

console 操作检索依赖关系,编译源代码并将它们放在 Scala REPL 的类路径上。要使用测试依赖关系和已编译的测试源代码进入 REPL,请运行 Test/console

使用插件和构建定义进入 Scala REPL 

> consoleProject

有关详细信息,请参见 consoleProject 页面。

定义在进入 Scala REPL 时评估的初始命令 

设置 console / initialCommands 以设置在运行 consoleconsoleQuick 时评估的初始语句。要单独配置 consoleQuick,请使用 consoleQuick / initialCommands。例如,

console / initialCommands := """println("Hello from console")"""

consoleQuick / initialCommands := """println("Hello from consoleQuick")"""

consoleProject 命令由 consoleProject / initialCommands 单独配置。默认情况下,它不使用来自 console / initialCommands 的值。例如,

consoleProject / initialCommands := """println("Hello from consoleProject")"""

定义在退出 Scala REPL 时评估的命令 

设置 console / cleanupCommands 以设置在退出由 consoleconsoleQuick 启动的 Scala REPL 后评估的语句。要单独配置 consoleQuick,请使用 consoleQuick / cleanupCommands。例如,

console / cleanupCommands := """println("Bye from console")"""

consoleQuick / cleanupCommands := """println("Bye from consoleQuick")"""

consoleProject 命令由 consoleProject / cleanupCommands 单独配置。默认情况下,它不使用来自 console / cleanupCommands 的值。例如,

consoleProject / cleanupCommands := """println("Bye from consoleProject")"""

从项目代码中使用 Scala REPL 

sbt 在与 sbt 本身相同的 JVM 中运行测试,Scala 类不在与应用程序类相同的类加载器中。这在 console 中以及当 run 未分叉时也是如此。因此,在使用 Scala 解释器时,务必将其正确设置,以避免类似以下错误消息:

Failed to initialize compiler: class scala.runtime.VolatileBooleanRef not found.
** Note that as of 2.8 scala does not assume use of the java classpath.
** For the old behavior pass -usejavacp to scala, or if using a Settings
** object programmatically, settings.usejavacp.value = true.

关键是使用embeddedDefaults 初始化解释器的设置。例如

val settings = new Settings
settings.embeddedDefaults[MyType]
val interpreter = new Interpreter(settings, ...)

这里,MyType 是一个代表性类,应包含在解释器的类路径上及其应用程序类加载器中。有关更多背景信息,请参见导致添加embeddedDefaults最初的提议

类似地,在使用ILoopbreakbreakIf 方法时,将代表性类用作类型参数,如以下示例所示

def x(a: Int, b: Int) = {
  import scala.tools.nsc.interpreter.ILoop
  ILoop.breakIf[MyType](a != b, "a" -> a, "b" -> b )
}