sbt 2.0 变更
涉及兼容性的变更
另请参阅 从 sbt 1.x 迁移。
- 元构建中的 Scala 3。sbt 2.x 的 build.sbt DSL 用于构建定义和插件,基于 Scala 3.x。(sbt 1.x 和 2.x 均能构建 Scala 2.x 和 3.x)由 @eed3si9n、@adpi2 等贡献。
- 通用设置。裸设置会添加到所有子项目,而不仅仅是根子项目,从而取代
ThisBuild所扮演的角色。 - 增量测试。
test任务已改为可缓存测试结果的增量测试。使用testFull进行完整测试,由 @eed3si9n 在 #7686 中贡献 - 缓存任务。默认情况下所有任务都会被缓存。详见 Caching。
- 依赖树。
dependencyTree任务已统一为一个输入任务,由 @eed3si9n 在 #8199 中贡献 test任务类型已从Unit改为TestResult,由 @eed3si9n 在 #8181 中贡献- 类型为
URL的默认设置和任务键(即apiMappings、apiURL、homepage、organizationHomepage、releaseNotesURL)已改为URI,见 #7927。 licenses键已从Seq[(String, URL)]改为Seq[License],见 #7927。- sbt 2.x 插件以
_sbt2_3后缀发布,由 @eed3si9n 在 #7671 中贡献 - sbt 2.x 添加了
platform设置,使ModuleID的%%运算符可以在 JVM、JS 和 Native 上进行交叉构建,而无需使用插件中为规避此问题而创建的%%%运算符,由 @eed3si9n 在 #6746 中贡献 - 移除了
useCoursier设置,因此无法选择不使用 Coursier,由 @eed3si9n 在 #7712 中贡献 Key.Classpath已改为Seq[Attributed[xsbti.HashedVirtualFileRef]]类型的别名,而非Seq[Attributed[File]]。同样,一些曾返回File的任务键已改为返回HashedVirtualFileRef。详见 Caching Files。- 在 sbt 2.x 中,
target默认为target/out/jvm/scala-3.8.4/<subproject>/,而非<subproject>/target/。 exportJars默认为true,在编译或测试时将 JAR 文件添加到类路径中。- sbt 2.x 在
build.sbt变更时默认自动重新加载,由 @eed3si9n 在 #8211 中贡献 - sbt 2.x 在 sbt shell 中禁用了作用域任务的委派,由 @eed3si9n 在 #8539 中贡献
- sbt 2.x 在
Test配置中强制执行驱逐错误,由 @calm329 和 @zainab-ali 在 #8451 + #9102 中贡献 - 在 sbt 2.x 中,全局基础目录遵循目录标准。Windows 上的默认值为
%LOCALAPPDATA%/sbt/2,否则为$XDG_CONFIG_HOME/sbt/2或$HOME/.config/sbt/2。详情请参阅 sbt 参考。 - 自 sbt 2.0.4 起,fork 运行在当前目录中执行,而非子项目的基础目录。
- 自 sbt 2.0.5 起,
closeClassLoaders设置默认为true,用于关闭进程内的临时测试 ClassLoader,见 #9538
已移除的弃用项
功能
- 项目矩阵。项目矩阵在 sbt 1.x 中通过插件提供,现已内置以支持并行交叉构建。
- sbt query。sbt 2.x 扩展了统一斜杠语法以支持子项目查询。详见下文。
- 本地/远程缓存系统。详见下文
- 客户端运行。详见下文。
- 客户端控制台。详见下文。
- rootProject 和 autoAggregate。详见下文
- Maven BOM(材料清单)的使用。详见下文
通用设置
在 sbt 2.x 中,build.sbt 中的裸设置被解释为通用设置,并注入到所有子项目中。这意味着我们现在可以在不使用 ThisBuild 作用域的情况下设置 scalaVersion:
scalaVersion := "3.8.4"
这也修复了所谓的动态分派问题:
lazy val hi = taskKey[String]("")
hi := name.value + "!"
在 sbt 1.x 中,hi 任务会捕获根项目的名称,而在 sbt 2.x 中,它会返回每个子项目的 name 并加上 !:
$ sbt show hi
[info] entering *experimental* thin client - BEEP WHIRR
[info] terminate the server with `shutdown`
> show hi
[info] foo / hi
[info] foo!
[info] hi
[info] root!
sbt query
为筛选子项目,sbt 2.x 引入了 sbt query。
$ sbt foo.../test
以上命令运行所有以 foo 开头的子项目。
$ sbt ...@scalaBinaryVersion=3/test
以上命令运行所有 scalaBinaryVersion 为 3 的子项目。由 @eed3si9n 在 #7699 中贡献
增量测试
在 sbt 2.x 中,test 任务已成为接受可筛选要运行的测试套件的参数的输入任务:
> test ...ExampleTest
此外,test 是增量且缓存的。这意味着,除非之前失败或自上次运行以来有所变更,否则测试不会运行。
详见 test。
本地/远程缓存系统
sbt 2.x 默认实现缓存任务,可自动将任务结果缓存到本地磁盘和与 Bazel 兼容的远程缓存。
lazy val task1 = taskKey[String]("doc for task1")
task1 := name.value + version.value + "!"
这会跟踪 task1 的输入并创建机器范围内的磁盘缓存,也可配置为使用远程缓存。由于 sbt 任务通常还会产生文件,我们还提供了缓存文件内容的机制:
lazy val task1 = taskKey[String]("doc for task1")
task1 := {
val converter = fileConverter.value
....
val output = converter.toVirtualFile(somefile)
Def.declareOutput(output)
name.value + version.value + "!"
}
详见 Caching。由 @eed3si9n 在 #7464 / #7525 中贡献
客户端运行
在 sbt 2.0 中,sbt server 将 run 任务发回 sbtn,后者将 fork 一个新的 JVM。您只需执行:
sbt run
这避免了阻塞 sbt server,您可以同时运行多个任务。由 @eed3si9n 在 #8060 中贡献。另请参阅 run 文档。
客户端控制台
与客户端运行类似,sbt server 将 console(Scala REPL)发回 sbtn,后者 fork 一个新的 JVM 来运行 REPL。您只需执行:
sbt console
这避免了阻塞 sbt server。由 @eed3si9n 和 @calm329 在 #8018、#8604、#8677、#8705、#8722 中贡献。
rootProject 和 autoAggregate
sbt 2.0 添加了 rootProject 宏:
lazy val root = rootProject
这是 (project in file(".")) 的快捷方式,在 build.sbt 中往往是样板代码。
lazy val root = rootProject
.autoAggregate
sbt 2.0 还添加了 autoAggregate 方法,在加载时扩展为本地子项目。
Maven BOM(物料清单)使用
sbt 2.0 添加了 Maven BOM(材料清单)的使用支持。子项目可以使用 .pomOnly() 依赖已发布的 BOM 工件:
libraryDependencies += ("com.fasterxml.jackson" % "jackson-bom" % "2.21.0").pomOnly()
这些材料清单通过 Resolve.addBom() 转发给 Coursier,为特定库(如 Jackson)引入版本约束。您可以使用 "*" 声明无版本依赖:
libraryDependencies += "com.fasterxml.jackson.core" % "jackson-core" % "*"
这将让 Coursier 根据材料清单约束自动填入版本(此例中为 "2.21.0")。由 @bitloi 在 #8675 中贡献。
性能改进
Adrien Piquerez 在 Scala Center 期间贡献了一系列性能改进。
- perf:减少长生命周期实例数量,相对于 2.0.0-M2 启动速度提升 20%,由 @adpi2 在 #7866 中贡献
- perf:减少
Setting和Initialize的创建,由 @adpi2 在 #7880 中贡献 - perf:重构
Settings并优化聚合键的索引,由 @adpi2 在 #7879 中贡献 - perf:移除
Info和BasicAttributeMap的实例,由 @adpi2 在 #7882 中贡献
sbt 以往版本
另请参阅: