如何在sbt中查看依赖树?

116

我正在尝试按照文档所述,检查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无法构建树?


1
请查看@TheKojuEffect针对sbt > 1.4的最新答案。 - UselesssCat
8个回答

168
如果您想查看库依赖项(就像使用Maven一样),而不是任务依赖项(这就是inspect tree显示的内容),那么您需要使用sbt-dependency-graph插件。

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

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

那么你就可以访问dependencyTree命令以及其他命令。


21
关于库依赖信息,还有Ivy生成的详细依赖报告。在执行sbt update之后,在像MSIE这样的浏览器中打开target/resolution-cache/reports/中的XML报告即可。 - Rich
17
没有引入库的方法吗?我开始怀念Maven了 :( - Jas
5
即使Maven通过插件实现了这一点,但当您运行dependency:tree时,Maven会自动获取插件(org.apache.maven.plugins:maven-dependency-plugin)。 - JMess
1
@DavidRabinowitz 技术上讲,这并没有回答问题,但是大多数找到这个问题的人实际上有一个不同的问题。 - OrangeDog
5
对于 sbt 1.0 及以上版本,你需要使用以下版本: addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.10.0-RC1") 或者查看 https://github.com/jrudolph/sbt-dependency-graph 获取最新版本和指南。 - silverbeak
显示剩余4条评论

94

使用 sbt 1.4.0 版本,dependencyTree 任务在 sbt 中可用,无需使用插件:

> sbt dependencyTree

sbt-dependency-graph已经包含在sbt 1.4.0中

sbt 1.4.0将Johannes Rudolph的sbt-dependency-graph插件引入了代码库。由于它为每个子项目注入了许多任务,该插件被分成两个部分:

  • MiniDependencyTreePlugin默认启用的,将dependencyTree任务引入到CompileTest配置中
  • 完整功能的DependencyTreePlugin通过将以下内容添加到project/plugins.sbt来启用:
addDependencyTreePlugin

请参阅旧的README文件以获取可用任务列表。

8
感谢你!自从 sbt 1.4 版本以后,这个答案是正确的。其他所有答案都或多或少过时了。(Stack Overflow 应该提供一种标记过时答案或类似的方式...) - jcsahnwaldt Reinstate Monica
根据输出结果,似乎依赖于JDK 11 [info] welcome to sbt 1.4.0 (Red Hat, Inc. Java 11.0.9)。这并不是什么坏事,但最好记住。 - vasigorc
1
很让人恼火的是,他们在sbt中没有包含所有的注释,我想要运行dependencyBrowseTree,但似乎必须添加整个插件才能实现。 - Daniele Sassoli
同意。这应该是 SBT 1.4+ 的正确答案。 - Mitrakov Artem
如何找到特定 jar 文件的依赖树? - Hoang Minh Quang FX15045
这个不起作用 - pavel_orekhov

90

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

  • 运行inspect命令,
  • 然后运行tree命令,
  • 最后是clean命令。

显然这个操作会失败,因为inspect需要一个参数。以下操作可以达到您的要求:

sbt "inspect tree clean"

29
这句话需要翻译为:它显示库依赖关系吗?我不这么认为。 - prayagupa
2
它对我有效,首先,我移动到sbt控制台并运行inspect tree clean命令。我得到了一个庞大的依赖树。 - Sun
2
我尝试了这个,它给出了一些无用的东西。但是我没有找到任何外部库。也就是说,我在输出中搜索Akka,但控制台中没有显示任何Akka的出现。它只显示了一些无用的树形结构,其中包含了我的本地和依赖模块的详细信息。这个命令毫无用处。请帮我找到比这更有用的命令。 - Sun
3
请看第二个答案以了解如何获取Maven/Ivy库依赖项,这正是你所寻找的内容。inspect tree <foo> 命令用于检查 sbt 任务和设置系统中任务 <foo> 的依赖关系,有时会很有用,但完全不同。 - gourlaysama
4
它打印出类似于树形结构的东西。这个不应该被接受作为答案。 - yerlilbilgin
显示剩余2条评论

23

@mjjaniec 谢谢!我现在会用它。到它改变的时候,希望网站已经有一个适当/稳定的入口。 - VasiliNovikov

5

我尝试使用上述提到的"net.virtual-void" % "sbt-dependency-graph"插件,输出结果为9K行(包括很多空行和重复内容),然而在Maven的mvn dependency:tree输出中,每个依赖项仅有一行,总计约180行。因此,我编写了一个sbt包装器任务来执行该Maven目标,虽然这是一个丑陋的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

3
这对我有用。参考 此处。 对于sbt < 1.3,请使用:
addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.10.0-RC1")

然后

sbt compile:dependencyTree

1

1
sbt 1.4 开始,将以下行添加到你的 project/plugins.sbt 文件中: addDependencyTreePlugin 然后你就可以使用这些功能了:
$ sbt dependencyTree
$ sbt dependencyBrowseTree
$ sbt dependencyBrowseGraph
... 

后两个在浏览器中具有图形输出,而...Tree则具有增量搜索功能。
(即使已存档,所有任务的列表仍然在这里提到)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接