如何在 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 clean
will:
inspect
命令,
然后运行tree
命令,
然后是clean
命令
这显然失败了,因为inspect
需要一个参数。这会做你想做的事:
sbt "inspect tree clean"
【讨论】:
它显示了什么库依赖??不要这么认为。 它对我有用,首先,我移动到 sbt 控制台并运行 inspect tree clean 命令。我有很大的依赖树。 我试过这个,它给了一些东西树。但我没有罚款任何外部库。即我在输出中搜索 Akka,我没有在控制台中显示任何出现的 Akka。它显示了一些无用的树。它只包含我的本地和依赖模块以及详细信息。这个命令没用。请帮我除此废话之外的任何命令。 @Sun:有关如何获取 maven/ivy library dependencies 的第二个答案,这正是您要寻找的。inspect tree <foo>
命令是关于在 sbt 的任务和设置系统中检查任务 <foo>
的依赖关系,这有时很有用,但完全不同。
它打印出类似树的东西。不应该是公认的答案【参考方案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 以便在联机时获取所有必要的依赖项,然后让我脱机工作?