Как увидеть дерево зависимостей в sbt?


Я пытаюсь проверить дерево зависимостей 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 не строит дерево?

4 58

4 ответа:

при запуске из командной строки, каждый аргумент, отправленный в sbt, должен быть командой, поэтому sbt inspect tree clean will:

  • запустить ,
  • запустить ,
  • тут clean команда

это явно не удается, так как inspect нужен аргумент. Это будет делать то, что вы хотите:

sbt "inspect tree clean"

Если вы хотите на самом деле просматривать зависимости библиотеки (как это было бы с Maven), а не зависимости задач (что такое inspect tree отображает), то вы хотите использовать sbt-dependency-graph плагин.

добавьте следующее в свой проект / Плагины.sbt (или глобальные Плагины.СБТ).

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

затем у вас есть доступ к и другие.

Если вы хотите посмотреть зависимостей библиотеки можно использовать coursier плагин:https://github.com/coursier/coursier#printing-trees

пример вывода : image текст (без цветов):https://gist.github.com/vn971/3086309e5b005576533583915d2fdec4

обратите внимание, что плагин имеет совершенно другую природу, чем печать деревья. Он предназначен для быстрой и одновременной загрузки зависимостей. Но это приятно и может быть добавлен практически в любой проект, поэтому я думаю, что это стоит упомянуть.

Я пробовал использовать "net.virtual-void" % "sbt-dependency-graph" плагин, упомянутый выше, и получил 9k строк в качестве вывода(есть много пустых строк и дубликатов) по сравнению с ~180 строками(ровно одна строка для каждой зависимости в моем проекте) в качестве вывода в Maven mvn dependency:tree выход. Поэтому я написал обертку sbt задание для этой цели Maven, уродливый хак, но он работает:

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