sbt 2.0 变更(草稿)
涉及兼容性的变更
另请参阅 从 sbt 1.x 迁移。
- 元构建中的 Scala 3。sbt 2.x 的 build.sbt DSL 用于构建定义和插件,基于 Scala 3.x(当前为 3.8.1)。(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.1/<subproject>/,而非<subproject>/target/。 - sbt 2.x 在
build.sbt变更时默认自动重新加载,由 @eed3si9n 在 #8211 中贡献 - 添加了
Project#autoAggregate以实现自动聚合,由 @eed3si9n 在 #8290 中贡献
已移除的弃用项
功能
- 项目矩阵。项目矩阵在 sbt 1.x 中通过插件提供,现已内置以支持并行交叉构建。
- sbt query。sbt 2.x 扩展了统一斜杠语法以支持子项目查询。详见下文。
- 本地/远程缓存系统。详见下文
- 客户端运行。详见下文。
通用设置
在 sbt 2.x 中,build.sbt 中的裸设置被解释为通用设置,并注入到所有子项目中。这意味着我们现在可以在不使用 ThisBuild 作用域的情况下设置 scalaVersion:
scalaVersion := "3.8.1"
这也修复了所谓的动态分派问题:
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 *Example*
此外,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 runner 1.10.10 及更高版本的脚本默认对 sbt 2.x 使用 sbtn(GraalVM native-image 客户端)。在 sbt 2.0 中,sbt server 将 run 任务发回 sbtn,sbtn 将 fork 一个新的 JVM。您只需执行:
sbt run
这避免了阻塞 sbt server,您可以同时运行多个任务。由 @eed3si9n 在 #8060 中贡献。另请参阅 run 文档。
性能改进
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 以往版本
另请参阅: