- Scala 教程
- Scala - 首页
- Scala - 概述
- Scala - 特性
- Scala - 环境设置
- Scala - 构建工具 (SBT)
- Scala - 基本语法
- 数据类型和变量
- Scala - 数据类型
- Scala - 变量
- Scala - 字符串
- Scala - 数组
- Scala 运算符
- Scala - 运算符
- Scala - 算术运算符
- Scala - 关系运算符
- Scala - 逻辑运算符
- Scala - 位运算符
- Scala - 赋值运算符
- Scala 条件语句
- Scala - IF ELSE
- Scala 循环语句
- Scala - 循环语句
- Scala - while 循环
- Scala - do-while 循环
- Scala - for 循环
- Scala - break 语句
- Scala 类和对象
- Scala - 类和对象
- Scala - 访问修饰符
- Scala 方法和函数
- Scala - 函数
- Scala - 按名称调用函数
- Scala - 带有名称参数的函数
- Scala - 带有可变参数的函数
- Scala - 递归函数
- Scala - 默认参数值
- Scala - 高阶函数
- Scala - 嵌套函数
- Scala - 匿名函数
- 部分应用函数
- Scala - 柯里化函数
- Scala 集合
- Scala - 集合
- Scala - 列表
- Scala - 集合
- Scala - 映射
- Scala - 元组
- Scala - 迭代器
- Scala - 选项
- Scala 模式匹配
- Scala - 模式匹配
- Scala - 异常处理
- Scala - 提取器
- Scala - 正则表达式
- Scala 文件 I/O
- Scala - 文件 I/O
- Scala 高级概念
- Scala - 闭包
- Scala - 特质
- Scala 有用资源
- Scala - 快速指南
- Scala - 在线编译器
- Scala - 有用资源
- Scala - 讨论
Scala - 构建工具
SBT 代表 **简单构建工具**。SBT 是一段时间以来 Scala 社区中非常流行和最常用的构建工具。它广泛的接受度和功能范围使其成为任何 Scala 项目的明确选择。SBT 流行的一个主要原因是构建定义是用 Scala 编写的。
SBT 安装
就像 **Maven** 一样,您可以将 SBT 下载为压缩文件夹。安装只需解压缩即可。除了解压缩之外,还可以根据您的平台使用各种工具安装 SBT。对于 Mac:使用 brew,对于 Debian Linux 使用 SDKMAN。在 Windows 上,使用 MSI 安装程序安装 SBT。
第一个项目
在计算机上安装 SBT 后,您可以使用 giter8 创建一个基本项目。
首先,运行以下命令:
sbt new scala/scala-seed.g8
根据 giter8 的说明,将生成一个新的项目目录。项目目录包含:
myProject/ project/ build.properties src/ main/ resources/ scala/ test/ resources/ scala/ build.sbt
要查看 project/build.properties 文件,请使用以下命令打开文件:`$ cat project/build.properties`
内容应为:
sbt.version = 1.8.2
您还可以修改 `sbt.version` 以更改项目构建的 SBT 版本。因此,您可以确保每个参与项目协作的人员都使用相同的 SBT 版本进行构建。接下来,运行 sbt 启动器并检查 sbt 版本。如果本地有 SBT 版本 1.8.2,则 SBT 启动器将自动下载它。
SBT 工作流程
要执行 SBT 命令,可以使用 SBT 命令进入 SBT shell 或在每个命令前添加 sbt 前缀。我们将在此处使用第二种方法,并在每个命令前添加 sbt 前缀。我们将讨论最常用的 SBT 任务。
编译
要编译并检查错误,请使用 `compile` 命令。例如:
sbt compile [info] welcome to sbt 1.8.2 (AdoptOpenJDK Java 11.0.12) // more logs [success] Total time: 2 s, completed Nov 9, 2023, 3:30:15 PM
测试编译
您可以使用 test:compile 命令编译测试类。SBT 会先编译非测试类,然后再编译测试类。运行 test:compile 命令:
sbt test:compile [info] welcome to sbt 1.8.2 (AdoptOpenJDK Java 11.0.12) [info] compiling 1 Scala source to /myProject/target/scala-2.13/classes ... [info] compiling 1 Scala source to /myProject/target/scala-2.13/test-classes ... [success] Total time: 3 s, completed Nov 9, 2023, 3:35:20 PM
测试
如上所述的目录结构中,/src/test/scala/ 是测试源的标准位置。giter8 模板已包含一个 HelloSpec。例如:
sbt test [info] welcome to sbt 1.8.2 (AdoptOpenJDK Java 11.0.12) // more logs [info] HelloSpec: [info] The Hello object [info] - should say hello [info] Run completed in 212 milliseconds. [info] Total number of tests run: 1 [info] Suites: completed 1, aborted 0 [info] Tests: succeeded 1, failed 0, canceled 0, ignored 0, pending 0 [info] All tests passed. [success] Total time: 1 s, completed Nov 9, 2023, 3:40:35 PM
运行
您可以使用 run 命令执行项目的 main 函数。您可以使用 mainClass 属性配置 main 函数或扩展 scala.App 特质。giter8 模板包含一个扩展 scala.App 特质的类。例如:
sbt run [info] welcome to sbt 1.8.2 (AdoptOpenJDK Java 11.0.12) // more logs [info] running com.example.MyApp Hello, Scala! [success] Total time: 0 s, completed Nov 9, 2023, 3:45:20 PM
软件工程师会对工具进行各种测试。他们将从多个 main 类运行命令。例如:
sbt run [info] welcome to sbt 1.8.2 (AdoptOpenJDK Java 11.0.12) // more logs Multiple main classes detected. Select one to run: [1] com.example.MyApp [2] com.example.AnotherApp Enter number: 2 [info] running com.example.AnotherApp Greetings from AnotherApp! [success] Total time: 278 s (04:38), completed Nov 9, 2023, 4:15:45 PM
清理
您可以使用 `clean` 命令删除先前生成的 target 目录。例如:
sbt clean [info] welcome to sbt 1.8.2 (AdoptOpenJDK Java 11.0.12) // more logs [success] Total time: 0 s, completed Nov 9, 2023, 4:20:15 PM
build.sbt 文件
build.sbt 文件概述了构建过程中的所有内容。它类似于项目的 Maven pom.xml。我们将讨论其最常用的概念。
库依赖项
您可以使用 zzlibraryDependencies 键包含更多库。例如:
// Single library libraryDependencies += "org.scalatestplus.play" %% "scalatestplus-play" % "5.0.0" % Test // Multiple libraries libraryDependencies ++= Seq( "org.scalatestplus.play" %% "scalatestplus-play" % "5.0.0" % Test, "org.mockito" % "mockito-core" % "3.5.13" % Test )
任务
任务提供值,并由键引用。这些可以生成任何 Scala 类型的值。考虑这个将“hello”打印到控制台的基本任务:
lazy val greetWorld = taskKey[Unit]("Prints 'Hello, World!'") greetWorld := println("Hello, World!")
现在,运行此 greetWorld 任务:
sbt greetWorld [info] welcome to sbt 1.8.2 (AdoptOpenJDK Java 11.0.12) // more logs Hello, World! [success] Total time: 0 s, completed Nov 9, 2023, 5:00:15 PM
任务可以将其他任务和属性作为输入。例如,创建一个将另一个任务的值乘以 2 的任务:
lazy val two = taskKey[Int]("two") two := 2 lazy val twoTimesThree = taskKey[Unit]("two times three") twoTimesThree := println(s"2 * 3 = ${2 * three.value}")
现在,运行此 twoTimesThree 任务:
sbt twoTimesThree [info] welcome to sbt 1.8.2 (AdoptOpenJDK Java 11.0.12) // more logs 2 * 3 = 6 [success] Total time: 0 s, completed Nov 9, 2023, 5:20:45 PM
命令
命令是命名操作,将当前构建状态作为参数并计算新状态。尽管命令和任务定义看起来相似。但命令功能更强大。它们可以访问甚至修改状态。
创建一个更改状态并向其中添加另一个命令的命令:
lazy val greetCommand = Command.command("greetCommand") { state => println("Greetings from custom command!") state } lazy val addGreetCommand = Command.command("addGreetCommand") { state => println("Adding greetCommand to defined commands.") state.copy(definedCommands = state.definedCommands :+ greetCommand) } lazy val root = (project in file(".")) .settings( // other settings .. commands ++= Seq(addGreetCommand) )
请注意,greetCommand 不包含在项目命令中。这意味着在调用 addGreetCommand 之后,helloCommand 才可访问。例如,使用 SBT shell 确保状态得到保留:
sbt [info] welcome to sbt 1.8.2 (AdoptOpenJDK Java 11.0.12) // more logs sbt:myProject> greetCommand [error] Not a valid command: greetCommand (similar: addGreetCommand, reload) [error] Not a valid project ID: greetCommand [error] Expected ':' [error] Not a valid key: greetCommand (similar: watchBeforeCommand, commands, addGreetCommand) [error] greetCommand [error] ^ sbt:myProject> addGreetCommand Adding greetCommand to defined commands. sbt:myProject> greetCommand Greetings from custom command!
命令别名
如果要一起运行一组任务或命令。您可以使用命令别名。例如,创建一个调用 compile 和 test 的别名:
addCommandAlias("buildAndTest", ";compile;test")
现在,运行 sbt buildAndTest 别名:
sbt buildAndTest [info] welcome to sbt 1.8.2 (AdoptOpenJDK Java 11.0.12) // compile logs [success] Total time: 0 s, completed Nov 9, 2023, 6:15:20 PM // test logs [info] All tests passed. [success] Total time: 3 s, completed Nov 9, 2023, 6:15:23 PM
解析器
您可以使用 resolvers 设置为 SBT 添加存储库以查找依赖项。例如,添加 Typesafe 和 Maven2 存储库:
resolvers ++= Seq( "Typesafe" at "https://repo.typesafe.com/typesafe/releases/", "Java.net Maven2 Repository" at "https://download.java.net/maven/2/" )
插件
SBT 插件主要由构建定义组成。简单来说,插件允许我们在构建中重用代码。您可以在项目中包含一个新插件,并在 project/plugins.sbt 文件中定义它。例如,将 scalafmt 插件添加到我们的项目中:
addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.6")