库依赖基础

本页介绍使用 sbt 进行库依赖管理的基础知识。

sbt 使用 Coursier 实现托管依赖,因此如果您熟悉 Coursier、npm、PIP 等包管理器,不会有太大困难。

什么是托管依赖?

与手动下载所需 JAR 文件(unmanaged 依赖)不同,managed(托管)依赖系统可自动为子项目获取外部库。Coursier 等工具会解析声明的 ModuleID,执行依赖解析(展开所有传递依赖并解决版本冲突以确定确切版本),下载并缓存生成的构件,确保 JAR 管理的一致性。

libraryDependencies

声明依赖如下所示,其中 groupIdartifactIdrevision 为字符串:

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]
....