【问题标题】:Is there maven dependency:get analog in sbt?是否存在 maven 依赖:在 sbt 中获取模拟?
【发布时间】:2015-02-03 09:34:22
【问题描述】:

如何使用 sbt 下载依赖项?使用 maven 是:

mvn dependency:get

sbt 中有类比吗?

【问题讨论】:

    标签: java scala maven dependencies sbt


    【解决方案1】:

    不幸的是,没有一个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)。这意味着即使 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
    

    【讨论】:

      【解决方案2】:

      除非我误解了the documentation of mvn dependency:get,否则sbt中的等价物是

      > update
      

      Dependency Management Flow

      【讨论】:

      • mvn dependency:get 允许您将工件从存储库下载到本地文件夹。所以 sbt update 与此无关。
      猜你喜欢
      • 1970-01-01
      • 2014-03-01
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      • 2013-01-15
      • 2013-05-22
      • 1970-01-01
      • 2012-08-06
      相关资源
      最近更新 更多