如何在sbt中查看依赖树?

问题描述 投票:0回答:8

我正在尝试检查 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不建树?

scala dependencies sbt
8个回答
168
投票

如果您想实际查看库依赖项(就像使用 Maven 一样)而不是任务依赖项(这就是

inspect tree
显示的内容),那么您需要使用 sbt-dependency-graph 插件。

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

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

然后您就可以访问

dependencyTree
命令和其他命令。


93
投票

使用 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
    任务引入
    Compile
    Test
    配置
  • 完全强度
    DependencyTreePlugin
    通过将以下内容置于
    project/plugins.sbt
    来启用:
addDependencyTreePlugin

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


90
投票

当从命令行运行时,发送到 sbt 的每个参数都应该是一个命令,所以

sbt inspect tree clean
将:

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

这显然失败了,因为

inspect
需要一个参数。这将实现您想要的:

sbt "inspect tree clean"

23
投票

如果你想查看库依赖关系,可以使用

coursier
插件:https://github.com/coursier/coursier/blob/master/doc/FORMER-README.md#printing-trees

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

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


5
投票

我尝试使用上面提到的

"net.virtual-void" % "sbt-dependency-graph"
插件,得到了 9K 行作为输出(有很多空行和重复项),而 Maven 的
mvn dependency:tree 中的输出则为 180 行(我的项目中的每个依赖项正好一行)。 
输出。所以我为 Maven 目标编写了一个 sbt 包装器task,这是一个丑陋的 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".!
}

3
投票

这对我有用。参考这里 对于 sbt < 1.3 use:

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

然后

sbt compile:dependencyTree

0
投票

sbt 1.4
开始添加到您的
project/plugins.sbt
如下行:

addDependencyTreePlugin

然后你就准备好了这些功能:

$ sbt dependencyTree
$ sbt dependencyBrowseTree
$ sbt dependencyBrowseGraph
... 

后两者在浏览器中具有图形输出,

...Tree
一个具有增量搜索功能。

(所有任务的列表仍然被提及这里即使它尚未存档)


0
投票

您现在可以在 IDEA 中使用 intellij-sbt-dependency-analyzer 插件了。

© www.soinside.com 2019 - 2024. All rights reserved.