1. sbt 1.0.x 版本

sbt 1.0.x 版本 

sbt 1.0.4 

这是 sbt 1.0.x 系列的修补版本。

Bug 修复 

增强功能 

内部 

贡献者 

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

根据 sbt、zinc、librarymanagement、util、io 和网站上的 git shortlog -sn --no-merges v1.0.3..v1.0.4,此版本由 17 位贡献者完成:Eugene Yokota、Kenji Yoshida (xuwei-k)、Jorge Vicente Cantero (jvican)、Dale Wijnand、Leonard Ehrenfried、Antonio Cunei、Brett Randall、Guillaume Martres、Arnout Engelen、Fulvio Valente、Jens Grassel、Matthias Kurz、OlegYch、Philippus Baalman、Sam Halliday、Tim Underwood、Tom Most。感谢您!


sbt 1.0.3 

这是 sbt 1.0.x 系列的修补版本。

Bug 修复 

  • 修复了 ~ 在循环中重新编译的问题(当存在源代码生成器或 sbt-buildinfo 时)。 #3501/#3634@dwijnand 提供
  • 修复了相同源代码上的继承编译不足问题。 zinc#424@eed3si9n 提供
  • 修复了包保护对象的编译问题。 zinc#431@jvican 提供
  • 为 Java 返回 nullgetGenericParameterTypes 提供了变通方案。 zinc#446@jvican 提供
  • 修复了测试检测回归问题。sbt 1.0.3 从列表中过滤掉了嵌套对象/类,恢复了与 0.13 的兼容性。 #3669@cunei 提供
  • 使用 Scala 2.12.4 进行构建定义。这包括修复了 Java 9 下空包成员的运行时反射问题。 #3587@eed3si9n 提供
  • 修复了 Ivy 风格模式中多余的 / 问题。 lm#170@laughedelic 提供
  • 通过包含文件名修复了“目标文件存在”错误消息。 lm171@leonardehrenfried 提供
  • 修复了库管理模块和 Ivy 中的 JDK 9 警告“非法反射访问”。 lm173@dwijnand 提供

改进 

  • 添加了 sbt.watch.mode 系统属性,允许切换回旧的轮询行为以进行监视。有关更多详细信息,请参见下文。

替代监视模式 

sbt 1.0.0 引入了一种新的机制,用于监视基于 Java 1.7 中的 NIO WatchService 的源代码更改。在某些平台(即 macOS)上,这导致在拾取更改之前出现长时间延迟。计划在 sbt 1.1.0 (#3527) 中为这些平台提供一个替代的 WatchService,在此期间,已添加了一个选项来选择使用哪种监视服务。

已添加新的 sbt.watch.mode JVM 标志,并支持以下值

  • polling:(macOS 的默认值)轮询文件系统以查找更改(sbt 0.13 中使用的机制)。
  • nio:(其他平台的默认值)使用基于 NIO 的 WatchService

如果您在非 macOS 机器上遇到长时间延迟,请尝试将 -Dsbt.watch.mode=polling 添加到您的 sbt 选项中。

#3597@stringbean 提供

贡献者 

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

此版本由 15 位贡献者完成,根据 sbt、zinc、librarymanagement、util、io 和网站上的 git shortlog -sn --no-merges v1.0.2..v1.0.3:Eugene Yokota、Dale Wijnand、Michael Stringer、Jorge Vicente Cantero (jvican)、Alexey Alekhin、Antonio Cunei、Andrey Artemov、Jeffrey Olchovy、Kenji Yoshida (xuwei-k)、Dominik Winter、Long Jinwei、Arnout Engelen、Justin Kaeser、Leonard Ehrenfried、Sakib Hadžiavdić。感谢您!


sbt 1.0.2 

这是 sbt 1.0.x 系列的修补版本。

Bug 修复 

  • 修复了终端回显问题。 #3507@kczulko 提供
  • 修复了 deliver 任务,并添加了 makeIvyXml 作为更合理的命名任务。 #3487@cunei 提供
  • 替换了已弃用的 OkUrlFactory 使用,并修复了连接泄漏问题。 lm#164@dpratt 提供
  • 重新修复了设置键的 DSL 检查器中的误报。 #3513@dwijnand 提供
  • 修复了 runbgRun 未拾取对类路径中目录的更改的问题。 #3517@dwijnand 提供
  • 修复了 ++,使其不再更改 crossScalaVersion 的值。 #3495/#3526@dwijnand 贡献。
  • 修复了 sbt 服务器缺少某些消息的问题。 #3523@guillaumebort 贡献。
  • 重新修复了 consoleProjectzinc#386@dwijnand 贡献。
  • 添加了 JVM 标志 sbt.gigahorse 来启用/禁用内部使用 Gigahorse 来解决 JavaNetAuthenticator 在与 repositories 覆盖一起使用时出现的 NPE 问题。 lm#167@cunei 贡献。
  • 添加了 JVM 标志 sbt.server.autostart 来启用/禁用 sbt 服务器与 sbt shell 自动启动。 这也添加了新的 startServer 命令来手动启动服务器。 由 @eed3si9n 贡献。

内部 

贡献者 

非常感谢所有帮助改进 sbt 和 Zinc 1 的人,包括使用它们、报告 bug、改进文档、移植插件以及提交和审查 pull 请求。

本版本由 19 位贡献者完成,根据 git shortlog -sn --no-merges v1.0.1..v1.0.2 在 sbt、zinc、librarymanagement 和网站上的统计数据:Dale Wijnand、Eugene Yokota、Kenji Yoshida (xuwei-k)、Antonio Cunei、David Pratt、Karol Cz (kczulko)、Amanj Sherwany、Emanuele Blanco、Eric Peters、Guillaume Bort、James Roper、Joost de Vries、Marko Elezovic、Martynas Mickevičius、Michael Stringer、Răzvan Flavius Panda、Peter Vlugter、Philippus Baalman 和 Wiesław Popielarski。 感谢大家!


sbt 1.0.1 

这是 sbt 1.0.x 系列的修补版本。

Bug 修复 

  • 修复了跨构建 + 命令的命令支持。 sbt 1.0 中添加的 + 会遍历子项目,尊重 crossScalaVersions;但是,它不再接受命令作为参数。 这将恢复对它的支持。 #3446@jroper 贡献。
  • 修复了 addSbtPlugin 在跨构建期间使用 sbt 的错误版本。 #3442@dwijnand 贡献。
  • 修复了 run in Compile 任务不包含 Runtime 配置的问题,方法是根据 bgRun 重新实现 run#3477@eed3si9n 贡献。
  • 显示 actual 作为 inspect 的潜在选项。 #3335@Duhemm 贡献。
  • 将基本目录包含在监视的源代码中。 #3439@Duhemm 贡献。
  • 尝试解决围绕日志记录的间歇性 NullPointerException 问题。 util#121@eed3si9n 贡献。
  • 恢复错误的向前移植。 #3481@eed3si9n 贡献。

WatchSource 

监视源功能从 sbt 0.13 到 sbt 1.0 使用 NIO 经历了重大变化;但是,它没有明确的迁移路径,因此我们在 sbt 1.0.1 中进行了纠正。

首先,sbt.WatchSourcesbt.internal.io.Source 的新别名。 希望这很容易记住,因为键名为 watchSources。 接下来,在 sbt.WatchSource 的伴随对象中添加了 def apply(base: File)def apply(base: File, includeFilter: FileFilter, excludeFilter: FileFilter) 构造函数。

为了向后兼容,sbt 1.0.1 添加了 += 支持(Append 实例)从 FileSeq[WatchSource]

因此,如果您要监视一个目录

watchSources += WatchSource(sourceDirectory.value)

如果您有一个文件列表

watchSources ++= (sourceDirectory.value ** "*.scala").get

#3438@Duhemm 贡献;#3478io#74@eed3si9n 贡献。


sbt 1.0.0 

具有兼容性影响的功能、修复和更改 

另请参阅 从 sbt 0.13.x 迁移

  • sbt 1.0 使用 **Scala 2.12** 用于构建定义和插件。 这也需要 JDK 8。
  • 许多案例类被使用 Contraband 生成的伪案例类替换。 将 .copy(foo = xxx) 迁移到 withFoo(xxx)。 例如,UpdateConfigurationRetrieveConfigurationPublishConfiguration 被重构为使用构建器模式。
  • Zinc 1 不再支持 Scala 2.9 及更早版本。 Scala 2.10 必须使用 2.10.2 及更高版本。 Scala 2.11 必须使用 2.11.2 及更高版本。(推荐使用最新补丁版本)
  • config("xyz") 必须直接分配给一个 *大写* 的 val,例如 val Xyz = config("xyz")。 这会将左侧标识符捕获到配置中,以便我们稍后从 shell 中使用它。
  • publishTootherResolvers 从 SettingKeys 更改为 TaskKeys。 #2059/#2662@dwijnand 贡献。
  • Path.relativizeFile(baseFile, file) 重命名为 IO.relativizeFile(baseFile, file)
  • PathFinder.*** 方法重命名为 .allPaths 方法。
  • PathFinder.x_!(mapper) 已移至 PathFinder 上的 def pair
  • sbt.Path 上的许多方法(例如 relativeTorebase 以及 flat)现在不再位于默认命名空间中,因为它们被混合到 sbt 包对象中。 使用 sbt.io.Path 再次访问它们。
  • sbt 1.0 将 Global 作为范围组件重命名为 Zero 以区分 GlobalScope@eed3si9n
  • sbt 1.0 在以前使用 String 来引用配置的地方使用 ConfigRef,例如 update.value.configuration(...)。 传入 Configuration,它会隐式转换为 ConfigRef
  • sourceArtifactTypesdocArtifactTypesSet[String] 更改为 Seq[String] 设置。
  • 将早期命令功能从 --<command> 重命名为 early(<command>)
  • 删除 sbt 0.12 风格的连字符分隔键名(使用 publishLocal 而不是 publish-local)。
  • 日志选项 -error-warn-info-debug 添加为 "early(error)" 等的简写。
  • sbt.Processsbt.ProcessExtra 已删除。 使用 scala.sys.process 代替。
  • incOptions.value.withNameHashing(...) 选项已删除,因为名称哈希始终处于打开状态。
  • TestResult.Value 现在称为 TestResult
  • 脚本插件现在是跨版本的,因此您在依赖它时必须使用 %%

删除了弃用的功能:

  • sbt 0.12 风格的 Build 特性,它在 sbt 0.13.12 中被弃用,现已删除。 请 迁移到 build.sbt。 自动插件和 Build 特性无法很好地协同工作,其功能现在在很大程度上被多项目 build.sbt 涵盖。
  • sbt 0.12 风格的 Project(...) 构造函数被限制为两个参数。 这是因为 settings 参数无法与自动插件很好地协同工作。 使用 project 代替。
  • sbt 0.12 风格的键依赖运算符 <<=<+=<++= 已删除。 请 迁移到 :=、+= 和 ++=。 这些运算符一直是许多用户混淆的来源,并且在 0.13 文档中早已删除,并且自 sbt 0.13.13 以来正式弃用。
  • 非自动 sbt.Plugin 特性已删除。 请迁移到 AutoPlugin。 自动插件更容易配置,并且能够更好地协同工作。
  • Project 中删除 settingsSets 方法(以及 add/setSbtFiles)。
  • 删除了弃用的 InputTask apply 方法和 inputTask DSL 方法。 使用 Def.inputTaskDef.spaceDelimited().parsed
  • 删除了弃用的 ProjectReference 隐式提升。 使用 RootProject(<uri>)RootProject(<file>)LocalProject(<string>)
  • 删除了弃用的 seq(..) DSL 方法。 使用 Seq 或在不包装的情况下传入设置。
  • 删除了弃用的 File/Seq[File] 设置增强。 使用 .valueDef.setting
  • 删除了弃用的 SubProcess apply 重载。 使用 SubProcess(ForkOptions(runJVMOptions = ..))
  • 删除了 toError(opt: Option[String]): Unit(等效于 opt foreach sys.error);如果用于包装 ScalaRun#run,则替换为 scalaRun.run(...).failed foreach (sys error _.getMessage)

功能 

  • 新的增量编译器称为 Zinc 1。 详细信息见下文。
  • 交互式 shell 添加了网络 API。 详细信息见下文。

修复 

  • 修复了测试内容日志未显示的问题。 #3198/util#80@eed3si9n 贡献。
  • 修复了关于“无法解析”的混淆日志。 lm#98@jvican 贡献。
  • 修复了 console 任务。 zinc#295@dwijnand 贡献。
  • 修复了当不相关的构造函数更改时发生的虚假重新编译问题。 zinc#288@smarter 贡献。
  • 修复了针对旧运算符的 restligeist 宏。 #3218@eed3si9n 贡献。
  • 修复了 update 任务的任务缓存问题。 #3233@eed3si9n 贡献。
  • 通过更新到 JLine 2.14.4 修复了 ncurses-JLine 问题。 util#81@Rogach 贡献。

改进 

  • Scala Center 贡献了一个 Java 友好的 Zinc API。 这是对 Zinc 内部 API 的彻底改革,以便与其他构建工具进行良好的 Scala 集成。 zinc#304@jvican 贡献。
  • Scala Center 贡献了 Zinc 内部存储的二进制格式。 如下所示
  • Scala Center 贡献了 build.sbt 的静态验证。 如下所示
  • 库管理 API 和并行工件下载。 如下所示
  • 在使用 scalas 的脚本模式下,启动日志级别降至 -error#840@eed3si9n 贡献。
  • 用 sbt-doge 替换跨构建支持。 这允许具有多个不同跨 Scala 版本组合的项目的构建能够正确地进行跨构建。 ++ 的行为已更改,因此它仅更新支持该 Scala 版本的项目的 Scala 版本,但 Scala 版本可以后缀 ! 以强制它更改所有项目。 添加了一个 -v 参数,它会打印有关哪些项目的设置正在更改以及它们的跨 Scala 版本的详细信息。 #2613@jroper 贡献。
  • 当检测到 CI 环境时,ivyLoggingLevel 将降至 UpdateLogging.Quiet@eed3si9n
  • 添加了对使用的不同 build.sbt(匹配 *.sbt)文件名称的记录。 #1911@valydia 贡献。
  • 添加了在 build.sbt 文件中对当前项目调用 aggregate 的能力。 由 @xuwei-k 贡献。
  • 添加了新的全局设置 asciiGraphWidth,用于控制 inspect tree 等命令打印的 ASCII 图表的最大宽度。 默认值对应于先前硬编码的 40 个字符值。 由 @RomanIakovlev 贡献。
  • 更新了 范围 的文档,并添加了 范围委托@eed3si9n
  • 移植了 sbt-cross-building 的 ^^^ 命令,用于插件交叉构建。见下文。
  • 添加了对交叉版本排除的支持。 #1518/lm#88 by @jvican
  • 为基于 Ivy 的库管理添加了新的离线模式。 lm#92 by @jvican
  • 一些与依赖项锁定相关的功能。见下文。
  • 改进的驱逐警告提示。见下文。
  • 更好的主类检测。 zinc#287 by @smarter
  • 为了更快的启动速度,sbt 将使用 Java 反射来发现 autoImport#3115 by @jvican
  • 为了更快的启动速度,重复使用相同的全局实例进行解析。 #3115 by @jvican
  • 从 sbt-core-next 添加了 InteractionService 以保持与 sbt 0.13 的兼容性。 #3182 by @eed3si9n
  • 添加了新的 WatchService,它抽象了 PollingWatchService 和 Java NIO。 io#47 by @Duhemm on behalf of The Scala Center.
  • 添加了 IO.copyFileIO.copyDirectory 的变体,它们接受 sbt.io.CopyOptions()。有关详细信息,请参见下文。
  • Path.directoryPath.contentOf 来自 sbt-native-packager io#38 by @muuki88
  • 用于调试 Zinc 的 ApiDiff 功能使用了从 Dotty 借用的 Scala 实现。 zinc#346 by @Krever
  • 在 Zinc 内部,使 ExtractAPI 使用 perRunCaches。 zinc#347 by @gheine

内部 

  • 采用 Scalafmt 使用 neo-scalafmt 对源代码进行格式化。
  • Scala Center 贡献了脚本测试框架的重新设计,该框架具有批处理模式执行。脚本现在重复使用相同的 sbt 实例来运行 sbt 测试,这将 CI 构建时间减少了 50% #3151 by @jvican
  • sbt 1.0.0-M6 使用 sbt 1.0.0-M5 构建。 #3184 by @dwijnand

主要更改的详细信息 

Zinc 1:基于类的名称哈希 

Grzegorz Kossakowski(由 Lightbend 委托)在 Zinc 1.0 中引入的一个重大改进是基于类的名称哈希,这将加速大型项目中 Scala 的增量编译。

Zinc 1.0 的名称哈希在类级别跟踪您的代码依赖关系,而不是在源文件级别。GitHub 问题 sbt/sbt#1104 列出了一些在某些项目中向现有类添加方法的比较

ScalaTest   AndHaveWord class:          Before 49s, After 4s (12x)
Specs2      OptionResultMatcher class:  Before 48s, After 1s (48x)
scala/scala Platform class:             Before 59s, After 15s (3.9x)
scala/scala MatchCodeGen class:         Before 48s, After 17s (2.8x)

这取决于一些因素,例如您的类是如何组织的,但您可以看到 3 倍到 40 倍的改进。速度提升的原因是,通过将类从源文件分离,它编译的源文件比以前更少。在向 scala/scala 的 Platform 类添加方法的示例中,sbt 0.13 的名称哈希以前编译了 72 个源文件,但新的 Zinc 只编译了 6 个源文件。

Zinc API 更改 
  • xsbti.compile 包下的 Java 类(如 IncOptions)隐藏了构造函数。使用工厂方法 xsbti.compile.Foo.of(...)
  • ivyScala: IvyScala 键重命名为 scalaModuleInfo: ScalaModuleInfo
  • xsbti.Reporter#log(...)xsbti.Problem 作为参数。调用 log(problem.position, problem.message, problem.severity) 以委托给旧的 log(...)
  • xsbi.Maybexsbti.F0sxbti.F1 已更改为相应的 Java 8 类 java.util.Optionaljava.util.Supplierjava.util.Function
  • 删除未使用的“resident”选项。 zinc#345 by @lukeindykiewicz
sbt 服务器:用于工具集成的 JSON API 

sbt 1.0 包含服务器功能,允许 IDE 和其他工具查询构建以获取设置,并通过 JSON API 调用命令。类似于 sbt 0.13 中交互式 shell 使用 shell 命令的方式,“服务器”也只是一个 shell 命令,它同时监听人类输入和网络输入。作为用户,服务器应该对您造成的影响最小。

在 2016 年 3 月,我们 重启 了“服务器”功能,使其尽可能小。我们与 JetBrains 的 @jastice(他负责 IntelliJ 的 sbt 接口)合作,缩小了功能列表。sbt 1.0 不会包含我们最初想要的所有功能,但从长远来看,我们希望通过这个系统看到 IDE 和 sbt 生态系统之间更好的集成。例如,IDE 将能够发出编译任务并以 JSON 事件的形式检索编译器警告

{"type":"xsbti.Problem","message":{"category":"","severity":"Warn","message":"a pure expression does nothing in statement position; you may be omitting necessary parentheses","position":{"line":2,"lineContent":"  1","offset":29,"pointer":2,"pointerSpace":"  ","sourcePath":"/tmp/hello/Hello.scala","sourceFile":"file:/tmp/hello/Hello.scala"}},"level":"warn"}

另一个相关的添加功能是 bgRun 任务,例如,它允许在您对其运行测试时,在后台运行服务器进程。

build.sbt 的静态验证 

sbt 1.0 禁止在任务的 if 表达式和匿名函数主体内部调用 .value,可以使用 @sbtUnchecked 注解来覆盖检查。

静态验证还会捕获您在任务主体中忘记调用 .value 的情况。

#3216#3225 by @jvican

驱逐警告提示 

sbt 1.0 改进了驱逐警告提示。

以前

[warn] There may be incompatibilities among your library dependencies.
[warn] Here are some of the libraries that were evicted:
[warn]  * com.google.code.findbugs:jsr305:2.0.1 -> 3.0.0
[warn] Run 'evicted' to see detailed eviction warnings

之后

[warn] Found version conflict(s) in library dependencies; some are suspected to be binary incompatible:
[warn]
[warn]      * com.typesafe.akka:akka-actor_2.12:2.5.0 is selected over 2.4.17
[warn]          +- de.heikoseeberger:akka-log4j_2.12:1.4.0            (depends on 2.5.0)
[warn]          +- com.typesafe.akka:akka-parsing_2.12:10.0.6         (depends on 2.4.17)
[warn]          +- com.typesafe.akka:akka-stream_2.12:2.4.17 ()       (depends on 2.4.17)
[warn]
[warn] Run 'evicted' to see detailed eviction warnings

#3202 by @eed3si9n

sbt-cross-building 

@jrudolph 的 sbt-cross-building 是插件作者的插件。它添加了交叉命令 ^ 和 sbtVersion 切换命令 ^^,类似于 +++,但用于在主要版本之间切换多个 sbt 版本。sbt 0.13.16 将这些命令合并到 sbt 中,因为随着我们迁移插件到 sbt 1.0,它提供的功能非常有用。

要从 shell 切换 sbtVersion in pluginCrossBuild,请使用

^^ 1.0.0-M5

您的插件现在将使用 sbt 1.0.0-M5(及其 Scala 版本 2.12.2)构建。

如果您需要对特定 sbt 版本进行更改,您现在可以将它们包含到 src/main/scala-sbt-0.13src/main/scala-sbt-1.0.0-M5 中,其中二进制 sbt 版本号用作后缀。

要在多个 sbt 版本上运行命令,请设置

crossSbtVersions := Vector("0.13.15", "1.0.0-M5")

然后,运行

^ compile

#3133 by @eed3si9n (从 0.13.16-M1 向前移植)

CopyOptions 

sbt IO 1.0 添加了 IO.copyFileIO.copyDirectory 的变体,它们接受 sbt.io.CopyOptions()CopyOptions() 是类似于构建器模式的伪 case class 的一个示例。

import sbt.io.{ IO, CopyOptions }

IO.copyDirectory(source, target)

// The above is same as the following
IO.copyDirectory(source, target, CopyOptions()
  .withOverwrite(false)
  .withPreserveLastModified(true)
  .withPreserveExecutable(true))

io#53 by @dwijnand

库管理 API 和并行工件下载 

sbt 1.0 添加了库管理 API,由来自 Lightbend 的 Eugene Yokota (@eed3si9n) 和来自 Scala Center 的 Martin Duhem (@Duhemm) 共同创作。此 API 旨在抽象 Apache Ivy 以及替代的依赖项解析引擎 Ivy、缓存解析和 Coursier。

来自 Scala Center 的 Jorge (@jvican) 贡献了 Ivy 引擎的并行工件下载。它还引入了 Gigahorse OkHttp 作为网络 API,并使用 Square OkHttp 进行工件下载。

lm#124 by @eed3si9n/@Duhemmlm#90 by @jvican/@jsuerethlm#104 by @eed3si9n.

Zinc 内部存储的二进制格式 

来自 Scala Center 的 Jorge (@jvican) 贡献了使用 Google Procol Buffer 的 Zinc 内部存储的二进制格式。新格式为我们提供了三个主要优势

  1. 在分析格式级别上的向后和向前二进制兼容性。
  2. 分析文件的序列化/反序列化速度更快(1.5 倍到 2 倍)。
  3. 提供了一种更好的方法来使分析文件与机器无关。

zinc#351 by @jvican

依赖项锁定 

依赖项锁定功能仍在开发中,但来自 Scala Center 的 Jorge (@jvican) 添加了一些相关功能,这些功能应该可以协同工作以允许依赖项锁定。

  • 基于 Ivy 的库管理的冻结模式,它确保解析始终是不可传递的。 lm#100
  • 添加了对指定依赖项解析器的支持。 lm#97
  • 添加了“托管校验和”,它告诉 Ivy 跳过校验和过程。 lm#111

贡献者 

这里要感谢太多人了。请参阅 Credits