如何在 sbt 中查看依赖树?

Posted

技术标签:

【中文标题】如何在 sbt 中查看依赖树?【英文标题】:How to see dependency tree in sbt? 【发布时间】:2014-10-20 14:40:30 【问题描述】:

我正在尝试检查 documentation 中描述的 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 【参考方案1】:

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

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

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

然后您就可以访问dependencyTree 命令和其他命令了。

【讨论】:

对于库依赖信息,还有Ivy生成的详细依赖报告。完成sbt update 后,在MSIE 等浏览器中打开target/resolution-cache/reports/ 中的XML 报告。 不引入库就不行吗?我开始想念 Maven :( @Jas 甚至 Maven 也通过插件实现了这一点,它只是当你运行 dependency:tree 时 maven 会自动抓取插件(org.apache.maven.plugins:maven-dependency-plugin) @DavidRabinowitz 从技术上讲它没有回答这个问题,但大多数发现这个问题的人实际上都有不同的问题。 对于 sbt 1.0 及更高版本,您需要此版本:addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.10.0-RC1") 或查看github.com/jrudolph/sbt-dependency-graph 以获取最新版本和说明。【参考方案2】:

从命令行运行时,发送给 sbt 的每个参数都应该是一个命令,所以sbt inspect tree cleanwill:

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

这显然失败了,因为inspect 需要一个参数。这会做你想做的事:

sbt "inspect tree clean"

【讨论】:

它显示了什么库依赖??不要这么认为。 它对我有用,首先,我移动到 sbt 控制台并运行 inspect tree clean 命令。我有很大的依赖树。 我试过这个,它给了一些东西树。但我没有罚款任何外部库。即我在输出中搜索 Akka,我没有在控制台中显示任何出现的 Akka。它显示了一些无用的树。它只包含我的本地和依赖模块以及详细信息。这个命令没用。请帮我除此废话之外的任何命令。 @Sun:有关如何获取 maven/ivy library dependencies 的第二个答案,这正是您要寻找的。 inspect tree &lt;foo&gt; 命令是关于在 sbt 的任务和设置系统中检查任务 &lt;foo&gt; 的依赖关系,这有时很有用,但完全不同。 它打印出类似树的东西。不应该是公认的答案【参考方案3】:

在 sbt 1.4.0 中,dependencyTree 任务在 sbt 中可用,无需使用插件。

sbt 依赖树

sbt-dependency-graph 包含在 sbt 1.4.0 中:https://www.scala-sbt.org/1.x/docs/sbt-1.4-Release-Notes.html#sbt-dependency-graph+is+in-sourced

可以通过将addDependencyTreePlugin 添加到project/plugins.sbt 来启用全强度依赖树。

可用命令列表:https://github.com/sbt/sbt-dependency-graph#usage-instructions

【讨论】:

谢谢!从 sbt 1.4 开始,这是正确的答案。所有其他答案或多或少都已过时。 (所以应该提供一种方法将答案标记为过时或类似的东西......) 根据输出,它似乎依赖于 JDK 11 [info] welcome to sbt 1.4.0 (Red Hat, Inc. Java 11.0.9)。不错,但要牢记在心。 虽然他们没有在 sbt 中包含所有 cmets,但我希望能够运行 dependencyBrowseTree,但似乎必须添加整个插件才能做到这一点,这很烦人。跨度> 同意。这应该是 SBT 1.4+ 的正确答案【参考方案4】:

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

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

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

【讨论】:

@mjjaniec 谢谢!我会暂时使用它。当它发生变化时,希望该网站将为此提供适当/稳定的条目。【参考方案5】:

我尝试使用上面提到的"net.virtual-void" % "sbt-dependency-graph" 插件并得到 9K 行作为输出(有很多空行和重复),而 Maven 的输出为 ~180 行(我的项目中的每个依赖项正好一行) mvn dependency:tree 输出。所以我为那个 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".!

【讨论】:

你的代码真的很有帮助,顺便说一句,如果有人试图在 Windows 上运行它,请不要忘记写 mvn.cmd 的绝对路径,而不是只写 mvn【参考方案6】:

这对我有用。参考here 对于 sbt

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

然后

sbt compile:dependencyTree

【讨论】:

以上是关于如何在 sbt 中查看依赖树?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 sbt 项目中使用 sbt 插件作为库依赖项?

如何使 SBT 任务依赖于同一个 SBT 项目中定义的模块?

如何设置 sbt 以便在联机时获取所有必要的依赖项,然后让我脱机工作?

SBT:如何创建实用程序 jar 作为构建后步骤以将所有依赖 jar 包含在类路径中

如何解决具有不同包装常春藤类型的sbt中的依赖关系?

如何在没有 sbt 的情况下运行 sbt 管理的应用程序项目?