sbt 需要取得專案的 Scala,它可以自動執行此操作,或者您可以明確設定它。為專案設定的 Scala 版本將會編譯、執行、建立文件,並為專案程式碼提供 REPL。編譯專案時,sbt 需要執行 Scala 編譯器,並為編譯器提供類別路徑,其中可能包含多個 Scala jar,例如反射 jar。
最常見的情況是您想使用儲存庫中提供的 Scala 版本。唯一需要的設定是您想使用的 Scala 版本。例如,
scalaVersion := "2.10.0"
這將從透過 resolvers
設定設定的儲存庫中擷取 Scala。它將使用此版本來建置您的專案:編譯、執行、scaladoc 和 REPL。
預設情況下,標準 Scala 函式庫會自動新增為依賴。如果您想以不同於預設值的方式設定它,或者您的專案只有 Java 原始碼,請設定
autoScalaLibrary := false
為了編譯 Scala 原始碼,Scala 函式庫需要位於類別路徑中。當 autoScalaLibrary
為 true 時,Scala 函式庫將會位於所有類別路徑中:測試、執行階段和編譯。否則,您需要像新增其他依賴一樣新增它。例如,以下依賴定義僅將 Scala 用於測試
autoScalaLibrary := false
libraryDependencies += "org.scala-lang" % "scala-library" % scalaVersion.value % "test"
當使用標準函式庫以外的 Scala 依賴時,請將其新增為一般的受管理依賴。例如,要依賴 Scala 編譯器,
libraryDependencies += "org.scala-lang" % "scala-compiler" % scalaVersion.value
請注意,無論上一節所述的 autoScalaLibrary
設定的值為何,這都是必要的。
為了編譯 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-compiler
和 scala-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 仍然會像以前一樣解析,但 jar 將來自設定的 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 jar 才能執行本身,因為它是以 Scala 撰寫的。sbt 使用相同的 Scala 版本來編譯您為專案撰寫的建置定義,因為它們使用 sbt API。此 Scala 版本對於特定的 sbt 版本是固定的,無法變更。對於 sbt 1.9.8,此版本為 Scala 2.12.18。由於在 sbt 執行之前需要此 Scala 版本,因此用於擷取此版本的儲存庫會在 sbt 啟動器中設定。