Wie sehe ich den Abhängigkeitsbaum in sbt?

87

Ich versuche, den SBT-Abhängigkeitsbaum wie in der Dokumentation beschrieben zu überprüfen :

sbt inspect tree clean

Aber ich bekomme diesen Fehler:

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

Was ist falsch? Warum baut SBT den Baum nicht?

Kirsche
quelle

Antworten:

84

Bei der Ausführung über die Befehlszeile soll jedes an sbt gesendete Argument ein Befehl sbt inspect tree cleansein.

  • Führen Sie den inspectBefehl aus.
  • Führen Sie dann den treeBefehl aus.
  • dann der cleanBefehl

Dies schlägt offensichtlich fehl, da inspectein Argument benötigt wird. Dies wird tun, was Sie wollen:

sbt "inspect tree clean"
Gourlaysama
quelle
21
Was zeigt es Bibliotheksabhängigkeiten? Glaube nicht.
Prayagupd
2
Es funktioniert für mich. Zuerst bin ich zur sbt-Konsole gewechselt und habe den Befehl inspect tree clean ausgeführt. Ich habe einen großen Baum von Abhängigkeiten.
So
2
Ich habe es versucht, es gibt ein bisschen Baum von Dingen. Aber ich habe keine externen Bibliotheken bestraft. dh ich suche in der Ausgabe nach Akka, ich habe kein Auftreten von Akka in der Konsole angezeigt. Es zeigt einen nutzlosen Baum. Es geht nur um meine lokalen und abhängigen Module und Details. Dieser Befehl ist nutzlos. Bitte helfen Sie mir bei jedem Befehl als diesem Unsinn bitte.
So
2
@Sun: In der zweiten Antwort erfahren Sie, wie Sie die Abhängigkeiten der Maven / Ivy- Bibliothek ermitteln können . Mit dem inspect tree <foo>Befehl werden die Abhängigkeiten der Aufgabe <foo>im Task & Setting-System von sbt überprüft. Dies ist manchmal nützlich, aber völlig anders.
Gourlaysama
3
Es druckt so etwas wie einen Baum. sollte nicht die akzeptierte Antwort sein
yerlilbilgin
151

Wenn Sie die Bibliotheksabhängigkeiten (wie bei Maven) und nicht die Aufgabenabhängigkeiten (die inspect treeangezeigt werden) anzeigen möchten, sollten Sie das Plugin sbt-dependency-graph verwenden .

Fügen Sie Ihrem Projekt / plugins.sbt (oder der globalen plugins.sbt) Folgendes hinzu.

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

Dann haben Sie Zugriff auf den dependencyTreeBefehl und andere.

OrangeDog
quelle
19
Für Informationen zur Bibliotheksabhängigkeit gibt es auch die detaillierten Abhängigkeitsberichte, die von Ivy generiert wurden. Nachdem ich sbt update, öffnen Sie die XML - Berichte in target/resolution-cache/reports/in einem Browser wie MSIE.
Rich
13
Auf keinen Fall ohne Einführung einer Bibliothek? Ich fange an, Maven zu vermissen :(
Jas
5
@Jas Even Maven erreicht dies durch ein Plugin. Es ist nur so, dass Maven das Plugin (org.apache.maven.plugins: maven-dependency-plugin) automatisch abruft, wenn Sie dependency: tree
ausführen
Ausgelöste Abhängigkeiten und leere Zeilen lassen es im Vergleich zur sauberen Ausgabe von maven wie einen Müll aussehen.
MaxNevermind
3
Für sbt 1.0 und höher benötigen Sie stattdessen diese Version: addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.10.0-RC1")Oder besuchen Sie github.com/jrudolph/sbt-dependency-graph, um die neueste Version und Anweisungen zu erhalten.
Silverbeak
20

Wenn Sie Bibliotheksabhängigkeiten anzeigen möchten , können Sie das coursierPlugin verwenden: https://github.com/coursier/coursier/blob/master/doc/FORMER-README.md#printing-trees

Ausgabebeispiel: Bild Text (ohne Farben): https://gist.github.com/vn971/3086309e5b005576533583915d2fdec4

Beachten Sie, dass das Plugin eine völlig andere Natur hat als das Drucken von Bäumen. Es wurde für schnelle und gleichzeitige Downloads von Abhängigkeiten entwickelt. Aber es ist schön und kann zu fast jedem Projekt hinzugefügt werden, daher denke ich, dass es erwähnenswert ist.

VasiliNovikov
quelle
@mjjaniec danke! Ich werde es jetzt benutzen. Wenn es sich ändert, wird die Website hoffentlich einen richtigen / stabilisierten Eintrag dafür haben.
VasiliNovikov
5

Ich habe versucht, "net.virtual-void" % "sbt-dependency-graph"das oben erwähnte Plugin zu verwenden, und habe 9K-Zeilen als Ausgabe (es gibt viele leere Zeilen und Duplikate) im Vergleich zu ~ 180 Zeilen (genau eine Zeile für jede Abhängigkeit in meinem Projekt) als Ausgabe in Mavens mvn dependency:treeAusgabe erhalten. Also habe ich eine sbt-Wrapper- Aufgabe für dieses Maven-Ziel geschrieben, einen hässlichen Hack, aber es funktioniert:

// 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
quelle
Ihr Code ist wirklich hilfreich. Übrigens, wenn jemand versucht, dies unter Windows auszuführen, vergessen Sie bitte nicht, den absoluten Pfad zu schreiben, mvn.cmdanstatt nur zu schreibenmvn
Sukumaar