如何使用 sbt 下载依赖项?对于 Maven,它是:
mvn dependency:get
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)
}
注意事项:
- 默认情况下,最近的 sbt 版本使用 coursier 来解决依赖关系,并且 coursier 有一个错误,它会忽略
retrieveDirectory
参数(参见 https://github.com/sbt/sbt/issues/5465 )。这意味着下载的文件不会被放入retrieveDirectory
,即使 API 假定如此。您可以禁用 coursier 并改用 ivy (useCoursier := false
),或者自己将文件复制到所需的目的地(上面的files
值是一个List [java.io.File]
包含下载的文件。
注意事项:
DependencyResolution.retrieve
下载 Artifact 及其所有依赖项。这就是上面添加exclude("*", "*")
的原因 - 仅下载 Artifact 本身并排除其所有依赖项。即使您检索单个依赖项,使用 coursier 此函数也可能会生成多个文件位置的列表(我假设这是由于依赖项解析逻辑的特殊性)。您可以使用列表中的任何文件,因为通常所有文件都指向同一个文件。
由于此实现使用了 sbt 的
dependencyResolution
,它尊重您可能已在 sbt 项目中声明的任何自定义解析器(自定义存储库)。
最后,虽然这没有与 sbt
集成,但也许值得一提,如果你碰巧有 coursier安装后可以使用 coursier fetch :
cs fetch com.typesafe.scala-logging::scala-logging:3.9.2
关于java - 是否有maven依赖:get analog in sbt?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27312089/