库依赖基础
本页介绍使用 sbt 进行库依赖管理的基础知识。
sbt 使用 Coursier 实现托管依赖,因此如果您熟悉 Coursier、npm、PIP 等包管理器,不会有太大困难。
与手动下载所需 JAR 文件(unmanaged 依赖)不同,managed(托管)依赖系统可自动为子项目获取外部库。Coursier 等工具会解析声明的 ModuleID,执行依赖解析(展开所有传递依赖并解决版本冲突以确定确切版本),下载并缓存生成的构件,确保 JAR 管理的一致性。
libraryDependencies 键
声明依赖如下所示,其中 groupId、artifactId 和 revision 为字符串:
libraryDependencies += groupID % artifactID % revision
或如下所示,其中 configuration 可以是字符串或 Configuration 值(如 Test):
libraryDependencies += groupID % artifactID % revision % configuration
当您运行:
> compile
sbt 将自动解析依赖并下载 JAR 文件。
使用 %% 获取正确的 Scala 版本
如果您使用 organization %% moduleName % version 而非 organization % moduleName % version(区别在于 organization 后的双 %%),sbt 会将您项目的二进制 Scala 版本添加到构件名称中。这只是一个快捷方式。您也可以不使用 %% 来编写:
libraryDependencies += "org.scala-lang" % "toolkit_3" % "0.2.0"
假设您构建的 scalaVersion 为 3.x,以下写法是等价的(注意 "org.scala-lang" 后的双 %%):
libraryDependencies += "org.scala-lang" %% "toolkit" % "0.2.0"
其思路是许多依赖针对多个 Scala 版本编译,您希望获取与您项目匹配的版本以确保二进制兼容性。
在一处跟踪依赖
project 下的 .scala 文件成为构建定义的一部分,我们可以通过创建名为 project/Dependencies.scala 的文件在一处跟踪依赖。
// place this file at project/Dependencies.scala
import sbt.*
object Dependencies:
// versions
lazy val toolkitV = "0.2.0"
// libraries
val toolkit = "org.scala-lang" %% "toolkit" % toolkitV
val toolkitTest = "org.scala-lang" %% "toolkit-test" % toolkitV
end Dependencies
Dependencies 对象将在 build.sbt 中可用。为便于使用其中定义的 val,请在您的 build.sbt 文件中导入 Dependencies.*。
import Dependencies.*
scalaVersion := "3.8.1"
name := "something"
libraryDependencies += toolkit
libraryDependencies += toolkitTest % Test
查看库依赖
在 sbt shell 中输入 Compile/dependencyTree 可显示库依赖树,包括传递依赖:
> Compile/dependencyTree
这应该会显示类似以下的内容:
sbt:bar> Compile/dependencyTree
[info] default:bar_3:0.1.0-SNAPSHOT
[info] +-org.scala-lang:scala3-library_3:3.3.1 [S]
[info] +-org.scala-lang:toolkit_3:0.2.0
[info] +-com.lihaoyi:os-lib_3:0.9.1
[info] | +-com.lihaoyi:geny_3:1.0.0
[info] | | +-org.scala-lang:scala3-library_3:3.1.3 (evicted by: 3.3.1)
[info] | | +-org.scala-lang:scala3-library_3:3.3.1 [S]
....