scala 如何在sbt中查看依赖树?

5ssjco0h  于 2023-06-29  发布在  Scala
关注(0)|答案(6)|浏览(227)

我正在尝试检查文档中描述的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不建树?

v1l68za4

v1l68za41#

如果您想实际查看库依赖关系(就像使用Maven一样)而不是任务依赖关系(inspect tree显示的内容),那么您需要使用sbt-dependency-graph插件。
将以下内容添加到您的项目/plugins.sbt(或全局plugins.sbt)。

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

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

ghg1uchk

ghg1uchk2#

  • 当从命令行运行 * 时,发送给sbt的每个参数都应该是一个命令,所以sbt inspect tree clean将:
  • 运行inspect命令,
  • 然后运行tree命令,
  • clean命令

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

sbt "inspect tree clean"
11dmarpk

11dmarpk3#

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

> sbt dependencyTree

sbt-依赖关系图包含在sbt 1.4.0中:
sbt 1.4.0将Johannes Rudolph的sbt-dependency-graph插件引入到代码库中。由于它为每个子项目注入了许多任务,插件被分成两部分:

  • MiniDependencyTreePlugin默认启用,将dependencyTree任务带入CompileTest配置
  • 通过将以下内容置于project/plugins.sbt中启用的全强度DependencyTreePlugin
addDependencyTreePlugin

有关可用任务的列表,请参见旧的README。

wn9m85ua

wn9m85ua4#

如果您想查看库依赖,可以使用coursier插件:https://github.com/coursier/coursier/blob/master/doc/FORMER-README.md#printing-trees
输出示例:

文本(无颜色):https://gist.github.com/vn971/3086309e5b005576533583915d2fdec4
请注意,该插件与打印树具有完全不同的性质。它是为快速和并发的依赖下载而设计的。但它很好,几乎可以添加到任何项目中,所以我认为值得一提。

cuxqih21

cuxqih215#

我尝试使用上面提到的"net.virtual-void" % "sbt-dependency-graph"插件,得到了9K行作为输出(有许多空行和重复行),而Maven的mvn dependency:tree输出中只有180行(在我的项目中每个依赖项只有一行)。因此,我为Maven目标编写了一个sbt Package 器task,这是一个丑陋的黑客,但它有效:

// 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".!
}
q1qsirdb

q1qsirdb6#

这对我很有效。参考here对于sbt < 1.3用途:

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

然后

sbt compile:dependencyTree

相关问题