Scala 编译为 JVM 字节码。构建时需要 Scala 编译器,应用运行时类路径中需要 Scala 标准库。
Scala 二进制版本是兼容性边界:以
_2.13 结尾的工件不能与对应的 _3 工件互换。
版本与工具链 #
Scala 2 和 Scala 3 使用不同的编译器和语言规则。对于每个交叉发布的库,都使用项目选定的二进制版本。Java 运行时必须满足 Scala 版本记录的 JDK 要求;使用部署时采用的 JDK 进行编译和测试。
For a small program:
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:versionfor a Java application;group::app:versionfor a Scala artifact;group:::app:versionfor a cross-version Scala artifact.
它从已配置的仓库解析依赖,然后将工件下载到本地缓存。仓库可以来自命令行、本地目录或频道描述符源。
频道是应用描述符 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 上阅读或评论(发表评论需要登录)