1. 設定 Scala

設定 Scala 

sbt 需要取得專案的 Scala,它可以自動執行此操作,或者您可以明確設定它。為專案設定的 Scala 版本將會編譯、執行、建立文件,並為專案程式碼提供 REPL。編譯專案時,sbt 需要執行 Scala 編譯器,並為編譯器提供類別路徑,其中可能包含多個 Scala jar,例如反射 jar。

自動管理的 Scala 

最常見的情況是您想使用儲存庫中提供的 Scala 版本。唯一需要的設定是您想使用的 Scala 版本。例如,

scalaVersion := "2.10.0"

這將從透過 resolvers 設定設定的儲存庫中擷取 Scala。它將使用此版本來建置您的專案:編譯、執行、scaladoc 和 REPL。

設定 scala-library 依賴 

預設情況下,標準 Scala 函式庫會自動新增為依賴。如果您想以不同於預設值的方式設定它,或者您的專案只有 Java 原始碼,請設定

autoScalaLibrary := false

為了編譯 Scala 原始碼,Scala 函式庫需要位於類別路徑中。當 autoScalaLibrary 為 true 時,Scala 函式庫將會位於所有類別路徑中:測試、執行階段和編譯。否則,您需要像新增其他依賴一樣新增它。例如,以下依賴定義僅將 Scala 用於測試

autoScalaLibrary := false

libraryDependencies += "org.scala-lang" % "scala-library" % scalaVersion.value % "test"

設定其他 Scala 依賴 

當使用標準函式庫以外的 Scala 依賴時,請將其新增為一般的受管理依賴。例如,要依賴 Scala 編譯器,

libraryDependencies += "org.scala-lang" % "scala-compiler" % scalaVersion.value

請注意,無論上一節所述的 autoScalaLibrary 設定的值為何,這都是必要的。

設定 Scala 工具依賴 

為了編譯 Scala 程式碼、執行 scaladoc 並提供 Scala REPL,sbt 需要 scala-compiler jar。這不應該是專案的一般依賴,因此 sbt 會在特殊的私人 scala-tool 組態中新增對 scala-compiler 的依賴。在某些情況下,可能需要對此進行更多控制。使用 managedScalaInstance 鍵停用此自動行為

managedScalaInstance := false

這也會停用對 scala-library 的自動依賴。如果您不需要 Scala 編譯器來進行任何操作(編譯、REPL、scaladoc 等…),您可以在此處停止。在這種情況下,sbt 不需要專案的 Scala 實例。否則,sbt 仍然需要存取 Scala 編譯器的 jar 以進行編譯和其他任務。您可以透過在 scala-tool 組態中宣告依賴,或明確定義 scalaInstance 來提供它們。

在第一種情況下,新增 scala-tool 組態,並在此組態中新增對 scala-compiler 的依賴。組織並不重要,但 sbt 需要模組名稱為 scala-compilerscala-library 才能適當地處理這些 jar。例如,

managedScalaInstance := false

// Add the configuration for the dependencies on Scala tool jars
// You can also use a manually constructed configuration like:
//   config("scala-tool").hide
ivyConfigurations += Configurations.ScalaTool

// Add the usual dependency on the library as well on the compiler in the
//  'scala-tool' configuration
libraryDependencies ++= Seq(
   "org.scala-lang" % "scala-library" % scalaVersion.value,
   "org.scala-lang" % "scala-compiler" % scalaVersion.value % "scala-tool"
)

在第二種情況下,直接建構 ScalaInstance 類型的值,通常使用 伴生物件 中的方法,並將其指派給 scalaInstance。您還需要將 scala-library jar 新增至類別路徑,才能編譯和執行 Scala 原始碼。例如,

managedScalaInstance := false
scalaInstance := ...
Compile / unmanagedJars += scalaInstance.value.libraryJar

切換至本機 Scala 版本 

若要使用本機建置的 Scala 版本,請按照以下章節所述設定 Scala 首頁。Scala 仍然會像以前一樣解析,但 jar 將來自設定的 Scala 首頁目錄。

從本機目錄使用 Scala 

從來源建置 Scala 的結果是一個 Scala 首頁目錄 <base>/build/pack/,其中包含一個子目錄 lib/,其中包含 Scala 函式庫、編譯器和其他 jar。下載並解壓縮 Scala 發行版也會獲得相同的目錄配置。透過設定 scalaHome,可以使用此類 Scala 首頁目錄作為 jar 的來源。例如,

scalaHome := Some(file("/home/user/scala-2.10/"))

預設情況下,lib/scala-library.jar 將新增至未受管理的類別路徑,而 lib/scala-compiler.jar 將用於編譯 Scala 原始碼並提供 Scala REPL。不會在 scala-library 上記錄任何受管理的依賴。這表示僅當您明確定義對 Scala 的依賴,或透過依賴間接依賴 Scala 時,才會從儲存庫解析 Scala。在這些情況下,已解析依賴的產出將會替換為 Scala 首頁 lib/ 目錄中的 jar。

與受管理的依賴混合使用 

例如,考慮在設定 scalaHome 時新增對 scala-reflect 的依賴

scalaHome := Some(file("/home/user/scala-2.10/"))

libraryDependencies += "org.scala-lang" % "scala-reflect" % scalaVersion.value

這將會像平常一樣解析,但 sbt 會查看 /home/user/scala-2.10/lib/scala-reflect.jar 是否存在。如果存在,則會使用該檔案來取代受管理依賴中的產出。

僅使用未受管理的依賴 

您可以直接新增 Scala jar,而不是新增受管理的依賴。scalaInstance 任務提供對 Scala 發行版的結構化存取。例如,若要新增 Scala 首頁 lib/ 目錄中的所有 jar,

scalaHome := Some(file("/home/user/scala-2.10/"))

Compile / unmanagedJars ++= scalaInstance.value.jars

若要僅新增部分 jar,請在新增之前從 scalaInstance 中篩選 jar。

sbt 的 Scala 版本 

sbt 需要 Scala jar 才能執行本身,因為它是以 Scala 撰寫的。sbt 使用相同的 Scala 版本來編譯您為專案撰寫的建置定義,因為它們使用 sbt API。此 Scala 版本對於特定的 sbt 版本是固定的,無法變更。對於 sbt 1.9.8,此版本為 Scala 2.12.18。由於在 sbt 執行之前需要此 Scala 版本,因此用於擷取此版本的儲存庫會在 sbt 啟動器中設定。