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 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, and @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 的參考實作,我實作了由 sbt-projectmatrix 外掛程式引入的稱為 projectMatrix 的新 DSL。

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 伺服器的實例。當伺服器未執行(找不到 portfile)時,它將在新的 JVM 中完全 fork 一個新的 sbt 實例。

這讓您可以從終端機殼層或編輯器中調用 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@eed3si9n 提供

此外,還有其他使用 Rust 實作的輕量級客戶端 cb372/sbt-clientdwijnand/sbtl

具有相容性影響的變更 

  • 移除已棄用的命令 ------。請改用 onFailuresbtClearOnFailureresumeFromFailure#4124
  • ++ 沒有影響任何子專案時,會使其失敗 #4269@eed3si9n 提供

其他錯誤修正和改進 

  • 修正輸出快取錯誤。 util#169@bpholt 提供
  • 修正「目的地檔案已存在」錯誤訊息。 lm#255@eed3si9n 提供
  • 重新引入 Command.process(String, State): State#4023@dwijnand 提供
  • 修正 JVM 關閉時未移除 active.json 的問題。 #4194@veera83372 提供
  • 修正 Windows 上讀取時間戳記時發生的檔案權限錯誤(「CreateFile() 失敗」)。 io#134@cunei 提供
  • 修正偵測遺失 .value 的 linter。 #4090@eed3si9n 提供
  • 修正 removeEscapeSequences 中的 StringIndexOutOfBoundsExceptionutil#139@dwijnand 提供
  • 修正 OkHttp 的 JavaNetAuthenticator 中的空值檢查。 lm#177@eed3si9n 提供
  • 透過將預設逾時時間延長至 1 小時來修正 Sonatype 逾時問題。 lm#246@peterneyens 提供
  • 修正平行下載期間的執行緒抖動錯誤。 lm249@OlegYch 提供
  • 修正記錄為錯誤的 JavaDoc 警告。 zinc#506@kaygorodov 提供
  • 修正類別相依性未擷取 classOf[A] 的問題。 zinc#510@natansil 提供
  • 修正類別相依性包含不存在的物件的問題。 zinc422@romanowski 提供
  • 修正已棄用的 0.10/0.12 DSL 語法文件的連結。 #3901 由 [@colindean] 提供
  • 修正 skip 鍵的文件。 #3926@dkim 提供
  • 修正非 fork 平行測試中的競爭條件。 #3985@retronym 提供
  • 修正當 Global / cancelable 設定為 true 時,fork 測試中的 Ctrl-C 處理。 #4226@driquelme 提供
  • 修正 run 的堆疊追蹤。 #4232@eed3si9n 提供
  • sbt new 使用的 Giter8 版本提升至 0.11.0,修正各種問題 #4263@eed3si9n 提供
  • 改進 Javac 錯誤解析。 zinc#557@eed3si9n 提供
  • 預設僅顯示逐出警告摘要,並使其可透過 ThisBuild / evictionWarningOptions 設定。 lm211#3947@exoego 提供
  • 允許在 inThisBuild(...)inConfig(C)(...)inTask(t)(...)inScope(scope)(...) 中使用可變參數。 #4106@dwijnand 提供
  • 新增行為類似 sbt 0.13 的 runfgRunfgRunMain 任務。 #4216@agaro1121 提供
  • 支援 test.scriptpending.script 作為指令碼檔案名稱。 #4220@regadas 提供
  • 支援 inspect 命令中的別名。 #4221@gpoirier 提供
  • 將目前專案的 ID 新增至 ~ 的監看訊息中。 #2038 / #3813@dwijnand 提供
  • PathFinder#get 變更為 get()io#104@dwijnand 提供
  • 改進拒絕存取時的錯誤訊息。 lm#203@stephennancekivell 提供
  • 將「選擇本機」警告訊息改進為更具可操作性的訊息。 lm#248@khvatov 提供
  • 新增一個選項來忽略 scalac 選項的變更。 zinc#548@lukaszwawrzyk 提供
  • 啟用外掛程式中指令碼的平行執行。 #3891@jvican 提供
  • 為 Configuration 軸範圍篩選器 inConfigurationsByKeysinConfigurationsByRefs 新增工廠方法。 #3994
  • 新增 lastGreploadFailed 等命令來取代烤肉串式命令。 #4080@naferx 提供、#4159@Asamsig 提供,以及 #4169@tiqwab 提供
  • 將時間戳記欄位新增至 JUnitXML 報告。 4154@timcharper 提供
  • 「載入設定」記錄訊息現在會顯示子專案名稱。 #4164@alodavi 提供
  • about 命令會排序和縮排外掛程式清單。 #4187@mcanlas 提供
  • -Dsbt.offline 設定 offline 設定。 #4198@eed3si9n 提供
  • 在跨 JDK fork 期間選取最新的 JDK(詳情請見下文) #4245@raboof 提供

內部變更 

  • 移除一些編譯器警告。 #3087@dwijnand 提供
  • @dwijnand 提供許多其他重構
  • 移除 Zinc 中的一些編譯器警告。 zinc#493@exoego 提供
  • 效能:防止在 IO.directoryURI 中建立無用的 URI 副本。 io#132@jrudolph 提供
  • 效能:避免在 initStringCodecs 中進行 reflect universe 初始化。 util#153@jrudolph 提供
  • 效能:加快 Parsers.validID 的速度。 #3952@jrudolph 提供
  • 效能:透過手動實作 for 理解來優化範圍委派。 #4003@jrudolph@eed3si9n 提供
  • 在內部程式碼中使用 val 而非 var#4253@xuwei-k 提供

貢獻者 

再次感謝所有協助改進 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。 謝謝你們!