【发布时间】:2015-02-03 09:34:22
【问题描述】:
如何使用 sbt 下载依赖项?使用 maven 是:
mvn dependency:get
sbt 中有类比吗?
【问题讨论】:
标签: java scala maven dependencies sbt
如何使用 sbt 下载依赖项?使用 maven 是:
mvn dependency:get
sbt 中有类比吗?
【问题讨论】:
标签: java scala maven dependencies sbt
不幸的是,没有一个sbt 命令可以用于此目的。但是,sbt 提供了一个 dependencyResolution 任务密钥,可用于实现 custom task 以从存储库下载单个 jar。
这是一个示例实现(将其添加到build.sbt):
lazy val downloadArtifact = taskKey[Unit]("Download an artifact")
downloadArtifact := {
val module = "com.typesafe.scala-logging" %% "scala-logging" % "3.9.2"
val dr = dependencyResolution.value
val files = dr.retrieve(
dr.wrapDependencyInModule(module exclude("*", "*")),
retrieveDirectory = new File("target"),
log = (streams in Compile).value.log
).fold(e => throw e.resolveException, identity(_))
println(files)
}
注意事项:
retrieveDirectory 参数(请参阅https://github.com/sbt/sbt/issues/5465)。这意味着即使 API 假定,下载的文件也不会放入 retrieveDirectory。您可以禁用 coursier 并改用 ivy (useCoursier := false),或者自己将文件复制到所需的目的地(上面的 files 值是带有下载文件的 List[java.io.File]。注意事项:
DependencyResolution.retrieve 下载工件及其所有依赖项。这就是为什么在上面添加 exclude("*", "*") 的原因 - 仅下载工件本身并排除其所有依赖项。
即使您检索单个依赖项,使用 coursier 时,此函数也可能会生成多个文件位置的列表(我认为这是由于依赖项解析逻辑的特殊性所致)。您可以使用列表中的任何文件,因为通常它们都指向同一个文件。
由于此实现使用 sbt 的 dependencyResolution,因此它尊重您可能在 sbt 项目中声明的任何自定义解析器(自定义存储库)。
最后,虽然这没有与sbt 集成,但也许值得一提的是,如果你碰巧安装了coursier,你可以使用coursier fetch:
cs fetch com.typesafe.scala-logging::scala-logging:3.9.2
【讨论】:
【讨论】:
mvn dependency:get 允许您将工件从存储库下载到本地文件夹。所以 sbt update 与此无关。