1. sbt 1.4.x 版本

sbt 1.4.x 版本 

sbt 1.4.1 

  • 修复 sbt new 不回显字符的问题 #5954 by @eatkins
  • 修复 Zinc 中的编译器错误报告问题 zinc#931 by @adpi2
  • 修复 dependencyBrowseTree 等问题 #5967 by @naderghanbari
  • 修复 Scala 2.13-3.0 三明治支持 Scala.JS 的问题 #5984 by @xuwei-k
  • 解决 classes 目录导致的“classes does not exist”错误问题 zinc#934 by @eed3si9n
  • ClassfileManager 输出中添加日志记录 #5990 by @smarter
  • 修复 Ctrl-CCtrl-D 处理问题 #5947/#5975 by @eatkins
  • 修复 -Dsbt.color=true 在某些情况下不起作用的问题 #5960 by @eatkins
  • 修复 project/target 是符号链接时出现的 FileAlreadyExistsException 问题 #5972 by @eatkins
  • 修复 ANSI 控制字符出现在管道输出中的问题 #5966 by @eatkins
  • 修复 jEdit 中的线路读取问题 #5946 by @eatkins
  • 修复 sbt 在无效的 build.sbt--batch 时挂起的问题 #5945 by @eatkins
  • 修复 .inputrc 文件支持问题 #5973 by @xuwei-k
  • 修复 BSP 警告诊断在重新编译时消失的问题 #5950 by @adpi2
  • 修复 BSP 对自定义配置的支持问题 #5930 by @adpi2
  • 修复自定义报告程序导致的 MatchError 问题 #5948 by @adpi2
  • 修复 shellPromptrelease* 键在构建 linting 时发出警告的问题 #5983/#5991 by @xirc and @eed3si9n
  • 修复 <task>.value 宏导致的“a pure expression does nothing”警告问题 #5981 by @eed3si9n
  • 在远程缓存中保留 SemanticDB 文件 #5961 by @xuwei-k
  • 添加 AdoptOpenJDK 支持以进行 JDK 交叉构建 #5964 by @rdesgroppes
  • 通过按子项目分组来改进 plugins 命令的输出 #5932 by @aaabramov

sbt 1.4.0 

sbt 1.4.0 的主要功能包括

  • 构建服务器协议 (BSP) 支持
  • sbtn:sbt 的原生精简客户端
  • 构建缓存
  • ThisBuild / versionScheme 消除驱逐警告的猜测

构建服务器协议 (BSP) 支持 

sbt 1.4.0 添加了构建服务器协议 (BSP) 支持,由 Scala Center 贡献。主要实现由 Adrien Piquerez (@adpi2) 完成,基于 @eed3si9n 的原型。

当 sbt 1.4.0 启动时,它将创建一个名为 .bsp/sbt.json 的文件,其中包含关于如何运行 sbt -bsp 的机器可读指令,sbt -bsp 是一个使用标准输入和输出与 sbt 服务器通信的命令行程序,使用构建服务器协议。

如何使用 BSP 导入 IntelliJ 

  1. 在终端中启动 sbt
  2. 打开 IntelliJ IDEA 2020.1.2 或更高版本
  3. 选择“打开或导入”,然后选择“BSP 项目”

如何导入 VS Code + Metals 

  1. 删除任何现有的 .bsp.metals.bloop 目录
  2. 在工作目录中打开 VS Code
  3. 忽略导入项目的提示
  4. 在终端选项卡中启动 sbt -Dsbt.semanticdb=true。等待它显示“sbt server started”
  5. 导航到 Metals 视图,然后选择“重新启动构建服务器”
  6. 在 sbt 会话中键入 compile 以生成 SemanticDB 文件

#5538/#5443 by @adpi2

原生精简客户端 

sbt 1.4.0 添加了一个官方原生精简客户端,称为 sbtn,它支持所有任务。如果您使用的是官方 sbt 启动器 1.4.0 而不是仿冒品,则可以使用 --client 选项来运行原生精简客户端

$ sbt --client compile
$ sbt --client shutdown

原生精简客户端将 sbt(服务器)作为守护进程运行,这将避免从第二次调用开始的 JVM 启动和加载时间。如果您想从系统 shell(如 Zsh 和 Fish)中使用 sbt,这可能是一个选择。

请记住在完成后调用 sbt --client shutdown!如果您想通过环境变量启用此功能,可以将 SBT_NATIVE_CLIENT 设置为 truesbtn 二进制文件也可以从 https://github.com/sbt/sbtn-dist/releases/tag/v1.4.0 获取

#5620 by @eatkins

ThisBuild / versionScheme 

sbt 1.4.0 添加了一个名为 ThisBuild / versionScheme 的新设置,用于跟踪构建的版本方案

ThisBuild / versionScheme := Some("early-semver")

支持的值为 "early-semver""pvp""semver-spec"。sbt 将此信息作为属性包含到 pom.xmlivy.xml 中。此外,sbt 1.4.0 将使用此信息来消除当此信息可用时,驱逐警告的猜测。 #5724 by @eed3si9n

VirtualFile + 远程缓存 

sbt 1.4.0 / Zinc 1.4.0 虚拟化了增量编译期间跟踪的文件路径。这带来的好处是,增量编译的状态可以在 *不同* 机器之间共享,只要事先枚举了 ThisBuild / rootPaths

为了演示这一点,我们还在 sbt 中添加了 *实验性* 的 缓存编译 功能。您只需要以下设置

ThisBuild / pushRemoteCacheTo := Some(MavenCache("local-cache", file("/tmp/remote-cache")))

然后从机器 1 调用 pushRemoteCache。这将把 *.class 和 Zinc 分析工件发布到该位置。接下来,从机器 2 调用 pullRemoteCache

zinc#712/#5417 by @eed3si9n

构建 linting 

在启动时,sbt 1.4.0 检查未使用的设置/任务。由于大多数设置是中间设置/任务,因此它们默认情况下包含在 linting 中。值得注意的例外是专门由命令使用的设置。要选择退出,您可以将其附加到 Global / excludeLintKeys 或将等级设置为不可见。

#5153 by @eed3si9n

条件任务 

sbt 1.4.0 添加了对条件任务(或选择性任务)的支持,这是一种新的任务类型,当 Def.task { ... } 包含一个 if 表达式时会自动创建。

bar := {
  if (number.value < 0) negAction.value
  else if (number.value == 0) zeroAction.value
  else posAction.value
}

与常规(应用)任务组合不同,条件任务会延迟 then-clause 和 else-clause 的评估,就像 if 表达式自然预期的那样。这可以通过 Def.taskDyn { ... } 实现,但与动态任务不同,条件任务可与 inspect 命令一起使用。有关详细信息,请参阅 sbt 的选择性函子#5558@eed3si9n 贡献。

增量构建流水线 

sbt 1.4.0 添加了实验性的增量构建流水线功能。要为构建启用构建流水线

ThisBuild / usePipelining := true

要选择退出为部分子项目创建早期输出

exportPipelining := false

#5703@eed3si9n 贡献。

sbt-dependency-graph 已整合 

sbt 1.4.0 将 Johannes Rudolph 的 sbt-dependency-graph 插件整合到代码库中。由于它为每个子项目注入许多任务,因此该插件被拆分为两个部分:- 默认情况下启用的 MiniDependencyTreePlugin,它将 dependencyTree 任务引入 CompileTest 配置- 全功能的 DependencyTreePlugin,可以通过将以下内容添加到 project/plugins.sbt 来启用

addDependencyTreePlugin

具有兼容性影响的修复 

  • 默认情况下用我们自己的日志记录器替换 Apache Log4j,以避免 Appender 泄漏。使用 ThisBuild / useLog4J := true 来使用 Log4j。 #5731@eatkins 贡献。
  • 通过按名称排序条目并删除时间戳,使 JAR 文件创建可重复 #5344/io#279@raboof 贡献。
  • 以构建文件的字母顺序加载裸设置 #2697/#5447@eed3si9n 贡献。
  • 从上到下加载构建文件中的 val #2232/#5448@eed3si9n 贡献。
  • HTTP 解析器需要使用 .withAllowInsecureProtocol(true) 显式选择加入 #5593@eed3si9n 贡献。
  • 在触发执行期间使用 Ctrl-C ~ 返回到 shell,而不是关闭 sbt #5804@eatkins 贡献。

其他更新 

  • 更新 shell 以使用 JLine 3 来实现更好的选项卡补全 #5671@eatkins 贡献。
  • 添加了对 Scala 2.13-3.0 三明治的支持 #5767@eed3si9n 贡献。
  • 如果您从 / 运行 sbt 且未设置 -Dsbt.rootdir=true,则会抛出错误 #5112@eed3si9n 贡献。
  • 更新 StateTransform 以接受 State => State #5260@eatkins 贡献。
  • 修复了与后台运行相关的各种问题 #5259@eatkins 贡献。
  • TERM 设置为“dumb”时,禁用超级外壳 #5278@hvesalai 贡献。
  • 避免将系统临时目录用于日志记录 #5289@eatkins 贡献。
  • 添加了 sbt.ForkMain 的库端点 #5315@olafurpg 贡献。
  • 避免使用目录的最后修改时间来使 doc 失效 #5362@eatkins 贡献。
  • 修复了自定义配置的 packageSrc 的默认工件 #5403@eed3si9n 贡献。
  • 修复了任务取消处理 #5446/zinc#742@azolotko 贡献。
  • 为元组语法将 toTaskable 方法注入 Initialize[A] #5439@dwijnand 贡献。
  • 修复了未定义设置的错误消息 #5469@nigredo-tori 贡献。
  • semanticdbVersion 更新为 4.3.7 #5481@anilkumarmyla 贡献。
  • 添加了 Tracked.outputChangedWTracked.inputChangedW,它们需要 JsonWriter[A] 的类型类证据,而不是 JsonFormat[A] #5513@bjaglin 贡献。
  • 修复了各种超级外壳干扰 #5319@eatkins 贡献。
  • 添加了 扩展方法State,以便于 sbt 服务器通信 #5207@eed3si9n 贡献。
  • 添加了对 testGrouping 的加权标签的支持 #5527@frosforever 贡献。
  • 更新到 sjson-new,它屏蔽了 Jawn 1.0.0 #5595@eed3si9n 贡献。
  • 修复了凭据域为 null 时出现的 NullPointerError #5526@3rwww1 贡献。
  • 添加了 Def.promise,用于长时间运行的任务与其他任务进行通信 #5552@eed3si9n 贡献。
  • 在 JDK 10+ 上使用 Java 的时间戳,而不是使用本机调用 io#274@slandelle 贡献。
  • 在发布期间添加了带回退的重试(-Dsbt.repository.publish.attempts 设置为 3) lm#340@izharahmd 贡献。
  • 改进了 PUT 的错误消息 lm#309@swaldman 贡献。
  • 将来源添加到 AnalyzedClass zinc#786@dwijnand + @mspnf 贡献。
  • 使 childrenOfSealedClass 的哈希稳定 zinc#788@dwijnand 贡献。
  • 修复了与构建源监控相关的性能回归 #5530@eatkins 贡献。
  • 修复了与超级外壳相关的性能回归 #5531@eatkins 贡献。
  • Zinc 中的各种性能改进 zinc#756/zinc#763@retronym 贡献。
  • 添加了一个监视器,用于警告过度的 GC #5812@eatkins 贡献。
  • 修复了当分叉测试匹配多个指纹时运行测试两次的问题 #5800@Duhemm 贡献。

参与 

sbt 1.4.0 由 34 位贡献者提供支持。Ethan Atkins、Eugene Yokota (eed3si9n)、Johannes Rudolph、Dale Wijnand、Adrien Piquerez、Jason Zaugg、Arnout Engelen、Josh Soref、Guillaume Martres、Maksim Ochenashko、Anil Kumar Myla、Brice Jaglin、Claudio Bley、João Ferreira、Steve Waldman、frosforever、Alex Zolotko、Heikki Vesalainen、Ismael Juma、Stephane Landelle、Jannik Theiß、izharahmd、lloydmeta、Alexandre Archambault、Eric Peters、Erwan Queffelec、Kenji Yoshida (xuwei-k)、Martin Duhem、Olafur Pall Geirsson、Renato Cavalcanti、Vincent PERICART、nigredo-tori。谢谢!