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 的默认设置和任务键(即 apiMappingsapiURLhomepageorganizationHomepagereleaseNotesURL)已改为 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 中贡献

已移除的弃用项

  • #8184 中移除了 IntegrationTest 配置
  • #7700 中移除了 sbt 0.13 风格的 shell 语法

功能

  • 项目矩阵。项目矩阵在 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!

@eed3si9n#6746 中贡献

sbt query

为筛选子项目,sbt 2.x 引入了 sbt query。

$ sbt foo.../test

以上命令运行所有以 foo 开头的子项目。

$ sbt ...@scalaBinaryVersion=3/test

以上命令运行所有 scalaBinaryVersion3 的子项目。由 @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:减少 SettingInitialize 的创建,由 @adpi2#7880 中贡献
  • perf:重构 Settings 并优化聚合键的索引,由 @adpi2#7879 中贡献
  • perf:移除 InfoBasicAttributeMap 的实例,由 @adpi2#7882 中贡献

sbt 以往版本

另请参阅: