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?


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"

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.


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ć.


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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.