Як побачити дерево залежностей у 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"

22
Що це показує бібліотечні залежності ?? Не думайте так.
праягупд

2
Це працює для мене, по-перше, я перейшов на консоль sbt і запустив команду inspect tree clean . Я отримав велике дерево залежностей.
нд

2
Я спробував це, це дає трохи дерева речей. Але я не штрафував жодної зовнішньої бібліотеки. тобто я шукав Akka у вихідних даних, я не показував жодного появи Akka у консолі. Це показує якесь марне дерево. Він має все про мої локальні та залежні модулі та лише деталі. Ця команда марна. Будь ласка, допоможіть мені будь-яку команду, крім цієї нісенітниці, будь ласка.
нд

2
@ Sun: див. Другу відповідь про те, як отримати залежності бібліотеки maven / ivy , що саме ви шукаєте. inspect tree <foo>Команда про перевірку залежностей завдання <foo>в завдання і налаштування системи SBT, яка іноді корисно, але абсолютно різні.
gourlaysama

4
На ньому друкується щось на зразок дерева. не повинна бути прийнятою відповіддю
yerlilbilgin

155

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

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

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

Тоді ви маєте доступ до dependencyTreeкоманди та інших.


19
Щодо інформації про залежність від бібліотеки, є також докладні звіти про залежності, створені Ivy. Після цього sbt updateвідкрийте звіти XML target/resolution-cache/reports/у такому браузері, як MSIE.
Багатий

14
ніяк не ввести бібліотеку? я починаю сумувати за Maven :(
Jas

5
@Jas Even Maven досягає цього за допомогою плагіна, це просто те, що maven захоплює плагін (org.apache.maven.plugins: maven-dependency-plugin) автоматично, коли ви запускаєте залежність: дерево
JMess

Виселені залежності та порожні рядки роблять це схожим на сміття порівняно з чистим результатом роботи 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 дякую! Поки що я його використаю. До моменту його зміни, сподіваємось, веб-сайт матиме належний / стабілізований запис для цього.
ВасильНовіков

5

Я спробував використати "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".!
}

Ваш код дуже корисний, до речі, якщо хтось намагається запустити це на Windows, будь ласка, не забудьте написати абсолютний шлях mvn.cmdзамість того, щоб писатиmvn
nomadSK25

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.