Scala 會編譯為 JVM 位元組碼。建置需要在編譯時期使用 Scala 編譯器,並在應用程式執行環境的類別路徑上提供 Scala 標準函式庫。Scala 二進位版本是相容性邊界:結尾為 _2.13 的構件不能與 _3 的對應構件互換。
版本與工具鏈 #
Scala 2 與 Scala 3 具有不同的編譯器與語言規則。對每個跨版本發布的函式庫,都使用專案選定的二進位版本。Java 執行環境必須符合 Scala 發行版本記載的 JDK 要求;使用部署時的 JDK 進行編譯與測試。
對於小型程式:
scala-cli run Main.scala
scala-cli test .Scala CLI 會管理以原始碼為導向的專案之編譯器與相依性解析。對於維護中的應用程式,應提交建置定義,而不是依賴開發者的本機命令歷史。
sbt #
sbt 是 Scala 的建置工具。啟動器會在 JVM 上啟動,並下載專案宣告的 sbt 版本。在 project/build.properties 中固定 sbt 版本,並只定義一次 Scala 版本:
ThisBuild / scalaVersion := "3.5.2"
ThisBuild / organization := "com.example"
lazy val root = (project in file("."))
.settings(
name := "orders",
libraryDependencies += "org.typelevel" %% "cats-core" % "2.12.0"
)在專案根目錄執行 sbt test、sbt compile 與 sbt package。%% 運算子會選擇符合目前 Scala 二進位版本的構件後綴。sbt 本身可以使用與專案不同的 Scala 版本執行;啟動器會使用 sbt 內部所需的版本。
Coursier #
Coursier 會解析 JVM 構件並安裝 Scala 工具。它可以依 Maven 座標啟動應用程式、快取相依性,以及安裝具名命令:
cs launch scala:3.5.2 -- -version
cs install scala-cli在自動化中使用明確的應用程式座標與版本。只有在座標與儲存庫受到控管時,Coursier 快取才會改善可重現性;它不能取代相依性鎖定或構件驗證。
座標、儲存庫與頻道 #
Coursier 重複使用 Maven 座標模型,並針對 Scala 特定構件加以擴充:
group:app:version代表 Java 應用程式;group::app:version代表 Scala 構件;group:::app:version代表跨版本 Scala 構件。
它會從已設定的儲存庫解析相依性,然後將構件下載到本機快取。儲存庫可以來自命令列、本機目錄或頻道描述元來源。
頻道是應用程式描述元 JSON 檔案的集合。頻道可以透過 HTTP 提供、由本機目錄支援,或封裝在 JAR 檔案中。因此,Coursier 能在沒有手寫建置定義的情況下探索可安裝的應用程式。
啟動器與封裝 #
Coursier 安裝的是可執行啟動器,而不是純原始碼樹。已安裝的命令通常是前置指令碼的 JAR:先是小型啟動器指令碼,接著是 JAR 位元組。Shell 包裝器會將 -J 選項傳給 JVM,然後執行嵌入應用程式中的主類別。
cs install scala-cli
cs launch scala:3.5.2 -- -version這種封裝讓使用者可以直接執行 ./tool,同時保留 java -jar 所需的 JAR 格式。實際取捨是啟動器仍然依賴快取的構件與選定的儲存庫集合。
評論
在 GitHub 上閱讀或評論(發表評論需要登入)