sbt 组件

sbt runner

sbt 构建使用 sbt 运行器执行,也称为 "sbt-the-shell-script" 以区别于其他组件。需要注意的是,sbt runner旨在运行任意版本的 sbt。

使用 project/build.properties 指定 sbt 版本

sbt runner执行名为 sbt launcher 的子组件,该组件读取 project/build.properties 以确定构建的 sbt 版本,并在未缓存时下载相应的构件:

sbt.version=2.0.0-RC9

这意味着:

  • 任何检出您构建的人都会获得相同的 sbt 版本,无论其机器上安装的 sbt runner 是什么。
  • sbt 版本的变更可以通过版本控制系统(如 git)进行跟踪。

sbtn(sbt --client

sbtn(原生代码瘦客户端)是 sbt runner的子组件,当您向 sbt runner传递 --client 标志时会被调用,用于向 sbt server发送命令。之所以称为 sbtn,是因为它使用 GraalVM native-image 编译为原生代码。sbtn 与 sbt server之间的协议足够稳定,应在 sbt 的大多数最新版本之间兼容。

sbt server(sbt --server

sbt server是实际的构建工具,其版本通过 project/build.properties 指定。sbt 服务器充当收银员,接收来自 sbtn 和编辑器的命令。

Coursier

sbt server将 Coursier 作为子组件运行,用于解析 Scala 库、Scala 编译器以及您的构建所需的任何其他库依赖。

Zinc

Zinc 是 Scala 的增量编译器,由 sbt 项目开发和维护。Zinc 的一个常被忽视的方面是,它提供了稳定的 API 来调用 Scala 编译器的任何现代版本。结合 Coursier 可以解析任何 Scala 版本这一事实,使用 sbt 我们只需在 build.sbt 中写一行即可调用任何现代版本的 Scala:

scalaVersion := "3.8.1"

BSP server

sbt server支持 Build Server Protocol (BSP) 来列出构建目标、构建它们等。这使得 IntelliJ 和 Metals 等 IDE 能够以编程方式与运行中的 sbt server通信。

连接到 sbt server

让我们看看连接到 sbt server的三种方式。

使用 sbtn 的 sbt shell

在您的构建工作目录中运行 sbt

sbt

Note

在 sbt 1.x 中,等效命令为 sbt --client

这应该会显示类似以下的内容:

$ sbt
[info] server was not detected. starting an instance
[info] welcome to sbt 2.0.0-alpha7 (Azul Systems, Inc. Java 1.8.0_352)
[info] loading project definition from /private/tmp/bar/project
[info] loading settings for project bar from build.sbt ...
[info] set current project to bar (in build file:/private/tmp/bar/)
[info] sbt server started at local:///Users/eed3si9n/.sbt/2.0.0-alpha7/server/d0ac1409c0117a949d47/sock
[info] started sbt server
[info] terminate the server with `shutdown`
[info] disconnect from the server with `exit`
sbt:bar>

不带命令行参数运行 sbt 会启动 sbt shell。sbt shell 具有命令提示符(支持 Tab 补全和历史记录!)。

例如,您可以在 sbt shell 中输入 compile

sbt:bar> compile

若要再次编译,请按上箭头键然后按回车。

若要退出 sbt shell,请输入 exit 或使用 Ctrl-D(Unix)或 Ctrl-Z(Windows)。

使用 sbtn 的批处理模式

您也可以以批处理模式运行 sbt:

sbt compile
sbt testOnly TestA
$ sbt compile
> compile

关闭 sbt server

运行以下命令以关闭您机器上的所有 sbt server:

sbt shutdownall

或运行以下命令以仅关闭当前服务器:

sbt shutdown