1. sbt 1.4.x 版本

sbt 1.4.x 版本 

sbt 1.4.1 

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 伺服器已啟動」
  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 + RemoteCache 

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
}

與常規 (Applicative) 任務組成不同,條件任務會延遲 then-clause 和 else-clause 的評估,這符合 if 運算式的自然預期。這已經可以使用 Def.taskDyn { ... } 實現,但與動態任務不同的是,條件任務可與 inspect 命令一起使用。請參閱 sbt 的選擇性函子 以取得更多詳細資料。#5558 by @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 來獲得更好的 Tab 鍵補全功能 #5671@eatkins 貢獻
  • 新增對 Scala 2.13-3.0 夾層結構的支援 #5767@eed3si9n 貢獻
  • 如果您從 / 執行 sbt 且沒有 -Dsbt.rootdir=true,則會擲回錯誤 #5112@eed3si9n 貢獻
  • 更新 StateTransform 以接受 State => State #5260@eatkins 貢獻
  • 修正有關背景執行的各種問題 #5259@eatkins 貢獻
  • TERM 設定為 “dumb” 時關閉超級 shell #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 貢獻
  • 修正各種超級 shell 干擾 #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 貢獻
  • 使 hashing childrenOfSealedClass 穩定 zinc#788@dwijnand 貢獻
  • 修正有關組建原始碼監控的效能回歸問題 #5530@eatkins 貢獻
  • 修正有關超級 shell 的效能回歸問題 #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。 感謝!