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

91

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

Ответы:

85

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

  • запустите inspectкоманду,
  • затем запустите treeкоманду,
  • тогда cleanкоманда

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

sbt "inspect tree clean"
Gourlaysama
источник
22
Что это показывает зависимости библиотеки ?? Не думаю.
прайагупд
2
У меня это работает. Во-первых, я перешел на консоль sbt и запустил команду очистки дерева проверки . Получилось большое дерево зависимостей.
Вс,
2
Я пробовал это, это давало немного дерева вещей. Но никаких внешних библиотек я не штрафовал. т.е. я ищу Akka в выводе, я не обнаружил появления Akka в консоли. Это показывает какое-то бесполезное дерево. Это касается только моих локальных и зависимых модулей и деталей. Эта команда бесполезна. Пожалуйста, помогите мне любой командой, кроме этой ерунды, пожалуйста.
Вс,
2
@Sun: см. Второй ответ о том, как получить зависимости библиотеки maven / ivy , а это именно то, что вы ищете. Команда inspect tree <foo>предназначена для проверки зависимостей задачи <foo>в системе задач и настроек sbt, что иногда полезно, но совершенно другое.
gourlaysama
4
Он печатает что-то вроде дерева. не должен быть общепринятым ответом
ерлилбилгин
155

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

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

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

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

OrangeDog
источник
19
Для информации о зависимостях библиотеки есть также подробные отчеты о зависимостях, созданные Ivy. После этого sbt updateоткройте отчеты XML target/resolution-cache/reports/в браузере, таком как MSIE.
Rich
15
никак без библиотеки? я начинаю скучать по maven :(
Jas
5
@Jas Даже Maven выполняет это через плагин, это просто maven автоматически захватывает плагин (org.apache.maven.plugins: maven-dependency-plugin), когда вы запускаете dependency: tree
JMess 05
Исключенные зависимости и пустые строки делают его похожим на мусор по сравнению с чистым выводом maven.
MaxNevermind
3
Для sbt 1.0 и выше вам понадобится эта версия: addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.10.0-RC1")Или посмотрите последнюю версию и инструкции на github.com/jrudolph/sbt-dependency-graph .
silverbeak
21

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

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

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

Василий Новиков
источник
@mjjaniec спасибо! Я пока воспользуюсь им. Надеюсь, к тому времени, когда он изменится, на веб-сайте будет правильная / стабильная запись для этого.
VasiliNovikov
5

Я попытался использовать "net.virtual-void" % "sbt-dependency-graph"упомянутый выше плагин и получил 9К строк в качестве вывода (есть много пустых строк и дубликатов) по сравнению с ~ 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".!
}
MaxNevermind
источник
ваш код действительно полезен, кстати, если кто-то пытается запустить это в Windows, пожалуйста, не забудьте написать абсолютный путь, mvn.cmdа не только писатьmvn
nomadSK25
3

С sbt 1.4.0 dependencyTreeзадача доступна в sbt без использования плагинов.

sbt dependencyTree

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

Эффект Кодзю
источник
спасибо за обновление этого старого вопроса!
raphaëλ