Jak zobaczyć drzewo zależności w SBT?

91

Próbuję sprawdzić drzewo zależności SBT zgodnie z opisem w dokumentacji :

sbt inspect tree clean

Ale pojawia się ten błąd:

[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]        ^

Co jest nie tak? Dlaczego SBT nie buduje drzewa?

wiśnia
źródło
Spójrz na najnowszą odpowiedź od @TheKojuEffect dla sbt> 1.4
UselesssCat

Odpowiedzi:

85

Po uruchomieniu z wiersza poleceń , każdy argument wysłany do sbt powinien być poleceniem, więc sbt inspect tree clean:

  • uruchom inspectpolecenie,
  • następnie uruchom treepolecenie,
  • następnie cleanpolecenie

To oczywiście zawodzi, ponieważ inspectwymaga argumentu. To zrobi, co chcesz:

sbt "inspect tree clean"
gourlaysama
źródło
22
Co pokazuje zależności bibliotek? Nie myśl tak.
prayagupd
2
To działa dla mnie. Najpierw przeniosłem się do konsoli sbt i uruchomiłem polecenie inspect tree clean . Mam duże drzewo zależności.
Niedziela,
2
Spróbowałem tego, dając trochę drzewa rzeczy. Ale nie ukarałem żadnych zewnętrznych bibliotek. tzn. wyszukuję Akka w wyjściu, nie pokazałem żadnego wystąpienia Akki w konsoli. Pokazuje bezużyteczne drzewo. Zawiera tylko informacje o moich lokalnych i zależnych modułach i szczegółach. To polecenie jest bezużyteczne. Proszę o pomoc w każdym poleceniu niż te bzdury, proszę.
Niedziela,
2
@ Słońce: zobacz drugą odpowiedź, aby dowiedzieć się, jak uzyskać zależności biblioteki maven / ivy , której właśnie szukasz. inspect tree <foo>Komenda jest o kontroli zależności związane z zadaniem <foo>w zadania i ustawień systemu SBT, która jest czasami przydatne, ale zupełnie inaczej.
gourlaysama
4
Drukuje coś w rodzaju drzewa. nie powinna być akceptowaną odpowiedzią
yerlilbilgin
155

Jeśli chcesz faktycznie wyświetlić zależności bibliotek (tak jak w przypadku Mavena), a nie zależności zadań (które są inspect treewyświetlane), będziesz chciał użyć wtyczki sbt-dependency-graph .

Dodaj następujące elementy do swojego projektu / plugins.sbt (lub globalnego pliku plugins.sbt).

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

Wtedy masz dostęp do dependencyTreepolecenia i innych.

OrangeDog
źródło
19
W przypadku informacji o zależnościach biblioteki dostępne są również szczegółowe raporty o zależnościach generowane przez Ivy. Po wykonaniu tej czynności sbt updateotwórz raporty XML target/resolution-cache/reports/w przeglądarce, takiej jak MSIE.
Rich
15
nie ma mowy bez wprowadzenia biblioteki? zaczynam tęsknić za mavenem :(
Jas
5
@Jas Even Maven robi to za pomocą wtyczki, po prostu maven pobiera wtyczkę (org.apache.maven.plugins: maven-dependency-plugin) automatycznie po uruchomieniu zależności: tree
JMess
Wyrzucone zależności i puste wiersze sprawiają, że wygląda to jak śmieć w porównaniu z czystym wyjściem Mavena.
MaxNevermind
3
W przypadku sbt 1.0 i nowszych potrzebujesz tej wersji: addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.10.0-RC1")Lub zajrzyj na github.com/jrudolph/sbt-dependency-graph, aby uzyskać najnowszą wersję i instrukcje.
Silverbeak
21

Jeśli chcesz zobaczyć zależności bibliotek , możesz użyć coursierwtyczki: https://github.com/coursier/coursier/blob/master/doc/FORMER-README.md#printing-trees

Przykład danych wyjściowych: wizerunek tekst (bez kolorów): https://gist.github.com/vn971/3086309e5b005576533583915d2fdec4

Zauważ, że wtyczka ma zupełnie inny charakter niż drukowanie drzew. Jest przeznaczony do szybkiego i równoczesnego pobierania zależności. Ale jest fajny i można go dodać do prawie każdego projektu, więc myślę, że warto o tym wspomnieć.

VasiliNovikov
źródło
@mjjaniec thanks! Na razie go użyję. Miejmy nadzieję, że zanim to się zmieni, strona internetowa będzie miała poprawny / ustabilizowany wpis do tego.
VasiliNovikov
5

Próbowałem użyć "net.virtual-void" % "sbt-dependency-graph"wspomnianej powyżej wtyczki i otrzymałem 9K linii jako wyjście (jest wiele pustych linii i duplikatów) w porównaniu do ~ 180 linii (dokładnie jedna linia na każdą zależność w moim projekcie) jako wynik wyjściowy Mavena mvn dependency:tree. Więc napisałem zadanie opakowujące sbt dla tego celu Maven, brzydki hack, ale działa:

// 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
źródło
twój kod jest naprawdę pomocny, przy okazji, jeśli ktoś próbuje to uruchomić w systemie Windows, nie zapomnij napisać bezwzględnej ścieżki mvn.cmdzamiast tylko pisaćmvn
nomadSK25