如何在sbt中看到依赖树?

Che*_*rry 75 dependencies scala sbt

我正在尝试检查文档中描述的SBT依赖树:

sbt inspect tree clean
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误:

[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]        ^
Run Code Online (Sandbox Code Playgroud)

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

Sto*_*ica 131

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

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

addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.9.2")
Run Code Online (Sandbox Code Playgroud)

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

  • 对于库依赖关系信息,还有Ivy生成的详细依赖关系报告.在执行`sbt update`之后,在像MSIE这样的浏览器中打开`target/resolution-cache/reports /`中的XML报告. (17认同)
  • 没有介绍图书馆没办法?我开始想念maven :( (7认同)
  • 对于 sbt 1.0 及更高版本,您需要这个版本: `addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.10.0-RC1")` 或者查看 https://github .com/jrudolph/sbt-dependency-graph 了解最新版本和说明。 (4认同)
  • @Jas Even Maven通过插件实现了这一点,只是当你运行依赖时,maven会自动抓取插件(org.apache.maven.plugins:maven-dependency-plugin):tree (3认同)

gou*_*ama 80

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

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

这显然是失败的,因为inspect需要一个论点.这将做你想要的:

sbt "inspect tree clean"
Run Code Online (Sandbox Code Playgroud)

  • 什么它显示库依赖?不要这么认为. (14认同)
  • 它打印出像树一样的东西。不应该是公认的答案 (3认同)
  • 它对我有用,首先,我移动到sbt控制台并运行**inspect tree clean**命令.我得到了一大堆依赖. (2认同)
  • 我试过这个,它给出了一些东西树。但我没有罚款任何外部库。即我在输出中搜索 Akka,我没有在控制台中显示任何 Akka 出现。它显示了一些无用的树。它仅包含有关我的本地和相关模块以及详细信息的所有信息。这个命令没用。请帮助我任何比这个废话的命令。 (2认同)
  • @Sun:看看如何获​​得maven/ivy*库依赖*的第二个答案,这就是你要找的东西.`inspect tree <foo>`命令是关于在sbt的任务和设置系统中检查任务`<foo>`的依赖关系,这有时是有用的,但完全不同. (2认同)

The*_*ect 50

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

sbt 依赖树

sbt 1.4.0:https : //github.com/sbt/sbt/releases/tag/v1.4.0

  • 谢谢!从 sbt 1.4 开始,这是正确的答案。所有其他答案或多或少都已经过时了。(所以应该提供一种将答案标记为过时或类似内容的方法......) (2认同)

Vas*_*kov 17

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

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

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


Max*_*ind 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".!
}
Run Code Online (Sandbox Code Playgroud)