sbt 2.0 变更(草稿)
涉及兼容性的变更
另请参阅 从 sbt 1.x 迁移。
- Scala 3 in metabuild. sbt 2.x build.sbt DSL, used for build definitions and plugins, is based on Scala 3.x (currently 3.8.2) (Both sbt 1.x and 2.x are capable of building Scala 2.x and 3.x) by @eed3si9n, @adpi2, and others.
- 通用设置。裸设置会添加到所有子项目,而不仅仅是根子项目,从而取代
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。- In sbt 2.x
targetdefaults totarget/out/jvm/scala-3.8.2/<subproject>/, as opposed to<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.2"
这也修复了所谓的动态分派问题:
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 以往版本
另请参阅: