Come vedere l'albero delle dipendenze in sbt?


91

Sto cercando di ispezionare l'albero delle dipendenze SBT come descritto nella documentazione :

sbt inspect tree clean

Ma ottengo questo errore:

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

Che c'è? Perché SBT non costruisce l'albero?


Guarda l'ultima risposta di @TheKojuEffect per sbt> 1.4
UselesssCat

Risposte:


85

Quando viene eseguito dalla riga di comando , ogni argomento inviato a sbt dovrebbe essere un comando, quindi sbt inspect tree clean:

  • esegui il inspectcomando,
  • quindi esegui il treecomando,
  • poi il cleancomando

Questo ovviamente fallisce, poiché inspectnecessita di un argomento. Questo farà quello che vuoi:

sbt "inspect tree clean"

22
Cosa mostra le dipendenze della libreria ?? Non credo proprio.
Prayagupd

2
Per me funziona, in primo luogo, sono passato alla console sbt ed ho eseguito il comando inspect tree clean . Ho un grande albero di dipendenze.
Dom

2
Ho provato questo, dando un po 'di cose. Ma non ho multato nessuna libreria esterna. cioè cerco Akka nell'output, non ho mostrato alcuna occorrenza di Akka nella console. Mostra un albero inutile. Ha tutto sui miei moduli e dettagli locali e dipendenti. Questo comando è inutile. Per favore aiutami a qualsiasi comando oltre a queste sciocchezze, per favore.
Dom

2
@Sun: vedi la seconda risposta su come ottenere le dipendenze della libreria maven / ivy , che è quello che stai cercando. Il inspect tree <foo>comando riguarda l'ispezione delle dipendenze dell'attività <foo>nel sistema di impostazione e attività di sbt, che a volte è utile, ma completamente diverso.
gourlaysama

4
Stampa qualcosa come un albero. non dovrebbe essere la risposta accettata
yerlilbilgin

155

Se vuoi visualizzare effettivamente le dipendenze della libreria (come faresti con Maven) piuttosto che le dipendenze delle attività (che è ciò che viene inspect treevisualizzato), allora ti consigliamo di utilizzare il plugin sbt-dependency-graph .

Aggiungi quanto segue al tuo progetto / plugins.sbt (o plugins.sbt globale).

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

Quindi hai accesso al file dependencyTree comando e ad altri.


19
Per le informazioni sulla dipendenza dalla libreria, ci sono anche i rapporti dettagliati sulle dipendenze generati da Ivy. Dopo averlo fatto sbt update, apri i rapporti XML target/resolution-cache/reports/in un browser come MSIE.
Rich

15
niente da fare senza introdurre una libreria? Comincio a perdere Maven :(
Jas

5
@Jas Even Maven lo fa tramite un plugin, è solo che Maven prende il plugin (org.apache.maven.plugins: maven-dependency-plugin) automaticamente quando esegui dependency: tree
JMess

Le dipendenze sfrattate e le righe vuote lo fanno sembrare una spazzatura in confronto all'output pulito di Maven.
MaxNevermind

3
Per sbt 1.0 e versioni successive, è invece necessaria questa versione: addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.10.0-RC1")oppure dai un'occhiata a github.com/jrudolph/sbt-dependency-graph per l'ultima versione e le istruzioni.
becco d'argento il

21

Se desideri visualizzare le dipendenze della libreria , puoi utilizzare il coursierplug-in: https://github.com/coursier/coursier/blob/master/doc/FORMER-README.md#printing-trees

Esempio di output: Immagine testo (senza colori): https://gist.github.com/vn971/3086309e5b005576533583915d2fdec4

Nota che il plugin ha una natura completamente diversa dalla stampa degli alberi. È progettato per download rapidi e simultanei delle dipendenze. Ma è bello e può essere aggiunto a quasi tutti i progetti, quindi penso che valga la pena menzionarlo.


@mjjaniec grazie! Lo userò per ora. Nel momento in cui cambierà, si spera che il sito web abbia una voce corretta / stabilizzata per questo.
VasiliNovikov

5

Ho provato a utilizzare il "net.virtual-void" % "sbt-dependency-graph"plug-in sopra menzionato e ho ottenuto 9K righe come output (ci sono molte righe vuote e duplicati) rispetto a ~ 180 righe (esattamente una riga per ogni dipendenza nel mio progetto) come output nell'output di Maven mvn dependency:tree. Così ho scritto un involucro SBT compito per quella Maven obiettivo, un brutto hack, ma funziona:

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

il tuo codice è davvero utile, BTW se qualcuno cerca di eseguirlo su Windows, non dimenticare di scrivere il percorso assoluto mvn.cmdinvece di scrivere solomvn
nomadSK25

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.