Comment voir l'arbre des dépendances dans sbt?

91

J'essaie d'inspecter l'arborescence de dépendances SBT comme décrit dans la documentation :

sbt inspect tree clean

Mais j'obtiens cette erreur:

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

Qu'est-ce qui ne va pas? Pourquoi SBT ne construit-il pas l'arbre?

Cerise
la source
Regardez la dernière réponse de @TheKojuEffect pour sbt> 1.4
UselesssCat

Réponses:

85

Lorsqu'il est exécuté à partir de la ligne de commande , chaque argument envoyé à sbt est censé être une commande, de même sbt inspect tree clean:

  • exécutez la inspectcommande,
  • puis exécutez la treecommande,
  • puis la cleancommande

Cela échoue évidemment, car il inspectfaut un argument. Cela fera ce que vous voulez:

sbt "inspect tree clean"
gourlaysama
la source
22
Qu'est-ce qu'il montre les dépendances de la bibliothèque? Ne le pense pas.
Prier
2
Cela fonctionne pour moi, tout d'abord, je suis passé à la console sbt et j'ai exécuté la commande inspect tree clean . J'ai un grand arbre de dépendances.
Dim
2
J'ai essayé ça, ça donne un peu d'arbre de choses. Mais je n'ai pas amendé de bibliothèques externes. c'est-à-dire que je recherche Akka dans la sortie, je n'ai montré aucune occurrence d'Akka dans la console. Il montre un arbre inutile. Il a tout sur mes modules et détails locaux et dépendants uniquement. Cette commande inutile. S'il vous plaît, aidez-moi toute commande que ce non-sens s'il vous plaît.
dim
2
@Sun: voyez la deuxième réponse pour savoir comment obtenir les dépendances de la bibliothèque maven / ivy , ce que vous recherchez. La inspect tree <foo>commande consiste à inspecter les dépendances de la tâche <foo>dans le système de tâches et de paramètres de sbt, ce qui est parfois utile, mais complètement différent.
gourlaysama
4
Il imprime quelque chose comme un arbre. ne devrait pas être la réponse acceptée
yerlilbilgin
155

Si vous voulez réellement afficher les dépendances de la bibliothèque (comme vous le feriez avec Maven) plutôt que les dépendances de la tâche (ce qui inspect trees'affiche), alors vous voudrez utiliser le graphe de dépendance sbt plugin .

Ajoutez ce qui suit à votre projet / plugins.sbt (ou au global plugins.sbt).

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

Ensuite, vous avez accès à la dependencyTreecommande, et à d'autres.

OrangeChien
la source
19
Pour les informations de dépendance de bibliothèque, il existe également les rapports de dépendance détaillés générés par Ivy. Après cela sbt update, ouvrez les rapports XML target/resolution-cache/reports/dans un navigateur tel que MSIE.
Rich
15
pas moyen sans introduire une bibliothèque? je commence à manquer maven :(
Jas
5
@Jas Even Maven accomplit cela via un plugin, c'est juste que maven saisit automatiquement le plugin (org.apache.maven.plugins: maven-dependency-plugin) lorsque vous exécutez dependency: tree
JMess
Les dépendances supprimées et les lignes vides le font ressembler à une poubelle par rapport au résultat propre de maven.
MaxNevermind
3
Pour sbt 1.0 et plus, vous avez besoin de cette version à la place: addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.10.0-RC1")ou jetez un œil à github.com/jrudolph/sbt-dependency-graph pour la dernière version et les instructions.
bec argenté
21

Si vous souhaitez afficher les dépendances de la bibliothèque , vous pouvez utiliser lecoursier plugin: https://github.com/coursier/coursier/blob/master/doc/FORMER-README.md#printing-trees

Exemple de sortie: image texte (sans couleurs): https://gist.github.com/vn971/3086309e5b005576533583915d2fdec4

Notez que le plugin a une nature complètement différente de l'impression d'arbres. Il est conçu pour des téléchargements de dépendances rapides et simultanés. Mais c'est bien et peut être ajouté à presque tous les projets, donc je pense que cela vaut la peine d'être mentionné.

VasiliNovikov
la source
@mjjaniec merci! Je vais l'utiliser pour l'instant. Au moment où il changera, j'espère que le site Web aura une entrée correcte / stabilisée pour cela.
VasiliNovikov
5

J'ai essayé d'utiliser le "net.virtual-void" % "sbt-dependency-graph"plugin mentionné ci-dessus et j'ai obtenu 9K lignes comme sortie (il y a beaucoup de lignes vides et de doublons) par rapport à ~ 180 lignes (exactement une ligne pour chaque dépendance dans mon projet) comme sortie dans la sortie de Maven mvn dependency:tree. J'ai donc écrit une tâche wrapper sbt pour cet objectif Maven, un hack laid mais cela fonctionne:

// 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
la source
votre code est vraiment utile, BTW si quelqu'un essaie de l'exécuter sous Windows, n'oubliez pas d'écrire le chemin absolu de mvn.cmdau lieu d'écrire uniquementmvn
nomadSK25