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 的默认设置和任务键(即 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
  • In sbt 2.x target defaults to target/out/jvm/scala-3.8.2/<subproject>/, as opposed to <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.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!

@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 以往版本

另请参阅: