1. sbt 1.2.x 版本

sbt 1.2.x 版本 

sbt 1.2.1 

向前二进制兼容性中断 

如果你正在编写插件,请使用 1.2.1+,并避免使用 1.2.0。

我们无意中在 1.2.0 中破坏了向前二进制兼容性。如果有人使用 sbt 1.2.0 发布 sbt 插件,则无法从 sbt 1.0.x 或 1.1.x 中使用它。sbt 1.2.1 恢复了更改,因此恢复了向前兼容性。不幸的是,这意味着我们无法在 inThisBuild(...) 等中再次使用可变参数。

请注意,我们最终可能会破坏向前兼容性,就像我们在 0.13.5 中为 AutoPlugin 做的那样,但只有当权衡利弊值得的时候才会这样做。

项目 Foo 引用了未知配置“bar” 

第二个回归修复是针对你可能在 1.2.0 中看到的一堵警告墙,如下所示

[warn] The project ProjectRef(uri("file:/Users/xxx/work/akka/"), "akka-actor-typed") references an unknown configuration "multi-jvm" and was guessed to be "Multi-jvm".
[warn] This configuration should be explicitly added to the project.
[warn] The project ProjectRef(uri("file:/Users/xxx/work/akka/"), "akka-actor-typed-tests") references an unknown configuration "multi-jvm" and was guessed to be "Multi-jvm".
[warn] This configuration should be explicitly added to the project.

最初的问题是,当配置不是子项目的一部分时,统一斜杠语法不会选择配置名称。由于此警告无关紧要,因此我们在此补丁版本中删除了它们。

插件作者可以开始做的一件事是将自定义配置声明为隐藏的,并将它们添加到子项目中,如下所示

import sbt._
import sbt.Keys._

object ParadoxPlugin extends AutoPlugin {
  val ParadoxTheme = config("paradox-theme").hide
  override def projectConfigurations: Seq[Configuration] = Seq(ParadoxTheme)

  ....
}

我们还在研究改进统一斜杠语法解析器,使其更加健壮。

其他错误修复 

贡献者 

衷心感谢所有通过使用、报告错误、改进文档、移植构建、移植插件以及提交和审核拉取请求来帮助改进 sbt 和 Zinc 1 的所有人。

根据 sbt、zinc、librarymanagement、util、io、launcher-package 和网站上的 git shortlog -sn --no-merges v1.2.1...v1.2.0,sbt 1.2.1 由 4 位贡献者带来:Eugene Yokota、Aaron S. Hawley、Ethan Atkins 和 Allan Renucci。谢谢!还要特别感谢 Ches Martin 和 Yoshida-san 报告这些问题。


sbt 1.2.0 

警告:我们在 1.2.0 中发现了向前兼容性中断,因此我们建议每个人升级到 sbt 1.2.1 或更高版本。

sbt 1.2 的主要功能是跨 JDK 分叉、复合项目和实验性瘦客户端。但是,还有许多其他错误修复和增强功能,这些功能是我们自 sbt 1.1 以来六个月内积累的。

用于插件开发的 SbtPlugin 

SbtPlugin 是一个插件,用于声明 sbt 插件的项目。这会自动引入脚本测试,并设置 sbtPlugin := true

lazy val root = (project in file("."))
  .enablePlugins(SbtPlugin)

兼容性说明ScriptedPlugin 不再是触发插件。

#3875 by @eed3si9n

跨 JDK 分叉 

对于分叉的 runtestjava++ 现在可以切换 Java Home。

sbt:helloworld> run
[info] Running (fork) Hello
[info] 1.8.0_171
sbt:helloworld> java++ 10!
[info] Reapplying settings...
sbt:helloworld> run
[info] Running (fork) Hello
[info] 10.0.1

sbt 将尝试检测 discoveredJavaHomes 设置中的 Java Home,支持 shyiko/jabba。这可以通过 Global / javaHomes 来增强。

Global / javaHomes += "6" -> file("/something/java-6")

此功能旨在用于在较旧的 JVM 中测试你的库以检查兼容性。

#4139 by @2m@cunei@eed3si9n

scalaVersion 过滤的聚合 

2015 年,James Roper 贡献了 scalaVersion 过滤的聚合到 sbt-doge。此功能通过 Rui Gonçalves (@ruippeixotog) 在 #3698/#3995 中带回了 sbt 1.2!

这将 switch 命令 ++ 扩展为接受一个可选的 <command>

> ++2.12.7 compile

这将仅聚合 ++2.12.7 有效的子项目,这在你有一个构建时非常有用,其中一些子项目仅限于 2.11 等。

复合项目 

sbt 1.2.0 引入了“复合项目”特征,它允许插件作者生成子项目,例如用于交叉构建。

trait CompositeProject {
  def componentProjects: Seq[Project]
}

这由 @BennyHill 作为 #4056 贡献。

项目矩阵 

实验性。作为 CompositeProject 的参考实现,我实现了一个名为 projectMatrix 的新 DSL,由 sbt-projectmatrix 插件引入。

lazy val core = (projectMatrix in file("core"))
  .scalaVersions("2.12.7", "2.11.12")
  .settings(
    name := "core"
  )
  .jvmPlatform()

lazy val app = (projectMatrix in file("app"))
  .dependsOn(core)
  .scalaVersions("2.12.7")
  .settings(
    name := "app"
  )
  .jvmPlatform()

该插件的目标是支持使用子项目表达的交叉构建(Scala 版本、平台等)的通用概念。在上面的 projectMarix 中,将生成三个子项目:coreJVM2_12coreJVM2_11appJVM2_12

语义版本选择器 API 

sbt 1.2.0 在 VersionNumber() 数据类型上引入了语义版本选择器,支持基本匹配、比较(<=<>=>)、组合(>1.0.0 <2.0.0||)、范围(A.B.C - D.E.F)和通配符(2.12.x)。

scala> import sbt.librarymanagement.{ VersionNumber, SemanticSelector }
import sbt.librarymanagement.{VersionNumber, SemanticSelector}

scala> VersionNumber("2.12.5").matchesSemVer(SemanticSelector(">=2.12"))
res1: Boolean = true

scala> VersionNumber("2.12.5").matchesSemVer(SemanticSelector("<2.12"))
res2: Boolean = false

scala> VersionNumber("2.13.0-M4").matchesSemVer(SemanticSelector("2.13"))
res3: Boolean = false

scala> VersionNumber("2.12.5").matchesSemVer(SemanticSelector("2.12.1 - 2.12.7"))
res4: Boolean = true

scala> VersionNumber("2.12.5").matchesSemVer(SemanticSelector("2.12.x"))
res5: Boolean = true

scala> VersionNumber("2.12.5").matchesSemVer(SemanticSelector("2.11.x || 2.12.x"))
res6: Boolean = true

注意:目前这对库管理没有影响。

这由 Rikito Taniguchi (@tanishiking) 作为 lm#239 贡献。

addPluginSbtFile 命令 

IntelliJ 提出过一个请求,要求安全地将插件注入构建中。sbt 1.2.0 添加了 -addPluginSbtFile 命令来执行此操作。

$ cat /tmp/extra.sbt
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.7")

$ sbt -addPluginSbtFile=/tmp/extra.sbt
...
sbt:helloworld> plugins
In file:/xxxx/hellotest/
  ...
  sbtassembly.AssemblyPlugin: enabled in root

@eed3si9n 作为 #4211 实现。

可扩展的 sbt 服务器 

实验性。sbt 服务器现在可以通过插件扩展。

    Global / serverHandlers += ServerHandler({ callback =>
      import callback._
      import sjsonnew.BasicJsonProtocol._
      import sbt.internal.protocol.JsonRpcRequestMessage
      ServerIntent(
        {
          case r: JsonRpcRequestMessage if r.method == "lunar/helo" =>
            jsonRpcNotify("lunar/oleh", "")
            ()
        },
        PartialFunction.empty
      )

此功能仍在实验阶段,API 可能会在将来发生变化。

#3975 by @eed3si9n

瘦客户端 

实验性。sbt 1.2.0 添加了一个名为 -client 的新模式。当 sbt 使用 -client 命令启动时,它不再加载构建,而是尝试通过 JSON-RPC 连接到 sbt 服务器的实例。当服务器未运行(未找到端口文件)时,它将在新的 JVM 中完全分叉 sbt 的新实例。

这使你能够从终端 shell 或编辑器中调用 sbt

$ time sbt -client clean
[info] entering *experimental* thin client - BEEP WHIRR
[info] server was not detected. starting an instance
[info] waiting for the server...
[info] waiting for the server...
[info] waiting for the server...
[info] waiting for the server...
[info] server found
> clean
[success] completed
sbt -client clean  9.23s user 2.33s system 22% cpu 50.558 total

# server stays
$ ps | rg java
21860 ttys015    1:22.43 java -Xms2048M -Xmx2048M -Xss2M -jar /usr/local/Cellar/sbt/1.1.6/libexec/bin/sbt-launch.jar
22014 ttys015    0:00.00 rg java

$ time sbt -client clean
[info] entering *experimental* thin client - BEEP WHIRR
> clean
[info] Updating ...
[info] Done updating.
[success] completed
sbt -client clean  3.39s user 1.75s system 104% cpu 4.898 total

要结束服务器,请调用 sbt -client shutdown#4227 by @eed3si9n

此外,还有一些使用 Rust 实现的替代瘦客户端 cb372/sbt-clientdwijnand/sbtl

具有兼容性影响的变更 

  • 删除了已弃用的命令------。请改用onFailuresbtClearOnFailureresumeFromFailure#4124
  • ++没有影响任何子项目时,使其失败 #4269 by @eed3si9n

其他错误修复和改进 

  • 修复了输出缓存错误。 util#169 by @bpholt
  • 修复了“目标文件已存在”的错误消息。 lm#255 by @eed3si9n
  • 重新引入Command.process(String, State): State#4023 by @dwijnand
  • 修复了JVM关闭时active.json没有被删除的问题。 #4194 by @veera83372
  • 修复了在Windows上读取时间戳时出现的“CreateFile()失败”的文件权限错误。 io#134 by @cunei
  • 修复了检测缺少.value的代码检查器。 #4090 by @eed3si9n
  • 修复了removeEscapeSequences中的StringIndexOutOfBoundsExceptionutil#139 by @dwijnand
  • 修复了OkHttp的JavaNetAuthenticator,并添加了空值检查。 lm#177 by @eed3si9n
  • 通过将默认超时时间延长至1小时,修复了Sonatype超时问题。 lm#246 by @peterneyens
  • 修复了并行下载过程中的线程抖动错误。 lm249 by @OlegYch
  • 修复了将JavaDoc警告记录为错误的问题。 zinc#506 by @kaygorodov
  • 修复了类依赖项无法获取classOf[A]的问题。 zinc#510 by @natansil
  • 修复了类依赖项包含不存在的对象的问题。 zinc422 by @romanowski
  • 修复了指向已弃用的0.10/0.12 DSL语法的文档的链接。 #3901 by [@colindean]
  • 修复了skip键的文档。 #3926 by @dkim
  • 修复了非分叉并行测试中的竞争条件。 #3985 by @retronym
  • 修复了当Global / cancelable设置为true时,分叉测试中Ctrl-C的处理问题。 #4226 by @driquelme
  • 修复了run的堆栈跟踪。 #4232 by @eed3si9n
  • sbt new使用的Giter8版本升级到0.11.0,修复了各种问题 #4263 by @eed3si9n
  • 改进了Javac错误解析。 zinc#557 by @eed3si9n
  • 默认情况下仅显示驱逐警告摘要,并可以通过ThisBuild / evictionWarningOptions进行配置。 lm211#3947 by @exoego
  • 允许在inThisBuild(...)inConfig(C)(...)inTask(t)(...)inScope(scope)(...)中使用可变参数。 #4106 by @dwijnand
  • 添加了fgRunfgRunMain任务,其行为类似于sbt 0.13的run#4216 by @agaro1121
  • 支持test.scriptpending.script作为脚本文件名。 #4220 by @regadas
  • 支持inspect命令中的别名。 #4221 by @gpoirier
  • 将当前项目的id添加到~的监控消息中。 #2038 / #3813 by @dwijnand
  • PathFinder#get更改为get()io#104 by @dwijnand
  • 改进了拒绝访问时的错误消息。 lm#203 by @stephennancekivell
  • 将“选择本地”的警告消息改为更具操作性的消息。 lm#248 by @khvatov
  • 添加了一个选项来忽略scalac选项的更改。 zinc#548 by @lukaszwawrzyk
  • 在插件中启用脚本的并行执行。 #3891 by @jvican
  • 为配置轴范围过滤器添加了工厂方法inConfigurationsByKeysinConfigurationsByRefs#3994
  • 添加了lastGreploadFailed等命令来替换连字符分隔的命令。 #4080 by @naferx#4159 by @Asamsig#4169 by @tiqwab
  • 将时间戳字段添加到JUnitXML报告中。 4154 by @timcharper
  • “加载设置”日志消息现在显示子项目名称。 #4164 by @alodavi
  • about命令对插件列表进行排序和缩进。 #4187 by @mcanlas
  • -Dsbt.offline设置offline设置。 #4198 by @eed3si9n
  • 在跨JDK分叉时选择最新的JDK(有关详细信息,请参见下文) #4245 by @raboof

内部 

贡献者 

再次感谢所有帮助改进sbt和Zinc 1的人。

sbt 1.2.0由60位贡献者共同完成。Dale Wijnand、Eugene Yokota、Kenji Yoshida (xuwei-k)、Yasuhiro Tatsuno (exoego)、Łukasz Wawrzyk、Jorge Vicente Cantero (jvican)、Alistair Johnson、Antonio Cunei、Jason Zaugg、Rikito Taniguchi (tanishiking)、Seiya Mizuno、Tim Harper、Aloisia Davì (alodavi)、Arnout Engelen、Ethan Atkins、Johannes Rudolph、Krzysztof Romanowski、Allan Renucci、Brian P. Holt、Filipe Regadas、Hiroshi Ito、Martijn Hoekstra、OlegYch、Seth Tisue、natans、Aaron S. Hawley、Alex Khvatov、Alexander Samsig、Andreas Jim-Hartmann、Andrei Pozolotin、Andrey Kaygorodov、Anthony Garo、Christopher Hunt、Colin Dean、Daniel Riquelme、Deokhwan Kim、Gerard Maas、Guillaume Poirier、Heikki Vesalainen、Jason Pickens、Jonas Fonseca、Julien Jerphanion、Justin Pihony、Kazufumi Nishida、Kyle Goodale、Maksym Fedorov、Mark Canlas、Martynas Mickevičius、Michael Pollmeier、Mike Skells、Nafer Sanabria、Naohisa Murakami (tiqwab)、PanAeon、Peter Neyens、Rui Gonçalves、Sean Sullivan、Stephen Nancekivell、Veera Venky、blakkan、ortigali。感谢你们!