如何查看sbt中的依赖树?


91

我正在尝试按照文档中所述检查SBT依赖关系树:

sbt inspect tree clean

但是我得到这个错误:

[error] inspect usage:
[error]   inspect [uses|tree|definitions] <key>   Prints the value for 'key', the defining scope, delegates, related definitions, and dependencies.
[error]
[error] inspect
[error]        ^

怎么了?SBT为什么不建树?


看看@TheKojuEffect对sbt> 1.4的最新答案
UselesssCat

Answers:


85

从命令行运行时,发送给sbt的每个参数都应该是一个命令,因此sbt inspect tree clean

  • 运行inspect命令,
  • 然后运行tree命令,
  • 然后clean命令

这显然是失败的,因为inspect需要争论。这将做您想要的:

sbt "inspect tree clean"

22
它显示了库依赖项吗?不要这样想。
祈祷

2
它为我工作,首先,我移至sbt控制台并运行inspect tree clean命令。我的依赖树很大。
2016年

2
我试过了,它给了东西一些东西。但是我没有对任何外部库进行罚款。即我在输出中搜索Akka,但在控制台中未显示任何Akka的出现。它显示了一些无用的树。它只包含有关我的本地模块和从属模块的详细信息。这个命令没用。除了这个废话,请帮助我任何命令。
太阳

2
@Sun:有关如何获取maven / ivy库依赖项的信息,请参见第二个答案。该inspect tree <foo>命令用于检查<foo>sbt的任务和设置系统中任务的依赖关系,这有时很有用,但完全不同。
gourlaysama

4
它打印出像树一样的东西。不应该是公认的答案
yerlilbilgin

155

如果要实际查看库依赖关系(就像使用Maven一样),而不是任务依赖关系(即inspect tree显示的内容),则需要使用sbt-dependency-graph插件。

将以下内容添加到您的project / plugins.sbt(或全局plugins.sbt)中。

addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.9.2")

然后,您可以访问该dependencyTree命令以及其他命令。


19
对于库依赖性信息,还有由Ivy生成的详细的依赖性报告。完成后sbt updatetarget/resolution-cache/reports/在类似MSIE的浏览器中打开XML报告。
Rich

14
没有引入图书馆就没有办法吗?我开始想念maven :(
Jas

5
@Jas Even Maven通过插件完成此任务,只是当您运行dependency:tree时,maven会自动抓住插件(org.apache.maven.plugins:maven-dependency-plugin)
JMess

与maven的干净输出相比,被逐出的依赖项和空行使其看起来像是垃圾。
MaxNevermind

3
对于sbt 1.0及更高版本,您需要使用此版本: addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.10.0-RC1")或者查看github.com/jrudolph/sbt-dependency-graph以获取最新版本和说明。
银喙

21

如果要查看库依赖性,可以使用coursier插件:https : //github.com/coursier/coursier/blob/master/doc/FORMER-README.md#printing-trees

输出示例: 图片 文本(无颜色):https : //gist.github.com/vn971/3086309e5b005576533533583915d2fdec4

请注意,该插件与打印树具有完全不同的性质。它设计用于快速并发依赖项下载。但这很不错,几乎可以添加到任何项目中,因此我认为值得一提。


@mjjaniec谢谢!我现在就使用它。希望随着时间的变化,网站上将对此进行适当/稳定的输入。
VasiliNovikov

5

我尝试使用"net.virtual-void" % "sbt-dependency-graph"上述插件,并获得了9K行作为输出(有许多空行和重复项),而Maven输出中的mvn dependency:tree输出为〜180行(对于我的项目中的每个依赖项实际上只有一行)。所以我为那个Maven目标写了一个sbt包装器任务,这是一个丑陋的hack,但是它可以工作:

// You need Maven installed to run it.
lazy val mavenDependencyTree = taskKey[Unit]("Prints a Maven dependency tree")
mavenDependencyTree := {
  val scalaReleaseSuffix = "_" + scalaVersion.value.split('.').take(2).mkString(".")
  val pomXml =
    <project>
      <modelVersion>4.0.0</modelVersion>
      <groupId>groupId</groupId>
      <artifactId>artifactId</artifactId>
      <version>1.0</version>
      <dependencies>
        {
          libraryDependencies.value.map(moduleId => {
            val suffix = moduleId.crossVersion match {
              case binary: sbt.librarymanagement.Binary => scalaReleaseSuffix
              case _ => ""
            }
            <dependency>
              <groupId>{moduleId.organization}</groupId>
              <artifactId>{moduleId.name + suffix}</artifactId>
              <version>{moduleId.revision}</version>
            </dependency>
          })
        }
      </dependencies>
    </project>

  val printer = new scala.xml.PrettyPrinter(160, 2)
  val pomString = printer.format(pomXml)

  val pomPath = java.nio.file.Files.createTempFile("", ".xml").toString
  val pw = new java.io.PrintWriter(new File(pomPath))
  pw.write(pomString)
  pw.close()

  println(s"Formed pom file: $pomPath")

  import sys.process._
  s"mvn -f $pomPath dependency:tree".!
}

您的代码真的很有帮助,顺便说一句,如果有人尝试在Windows上运行此代码,那么请不要忘记写的绝对路径,mvn.cmd而不仅仅是写mvn
nomadSK25

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.