web-dev-qa-db-fra.com

Comment voir l'arbre de dépendance dans sbt?

J'essaie d'inspecter l'arbre de dépendance SBT comme décrit dans la documentation :

sbt inspect tree clean

Mais je reçois 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?

74
Cherry

Lorsqu'il est exécuté depuis la ligne de commande, chaque argument envoyé à sbt est censé être une commande, donc sbt inspect tree cleanvolonté:

  • lancez la commande inspect,
  • puis exécutez la commande tree,
  • puis la commande clean

Cela échoue évidemment, puisque inspect nécessite un argument. Cela fera ce que vous voulez:

sbt "inspect tree clean"
79
gourlaysama

Si vous voulez réellement visualiser les dépendances de la bibliothèque (comme vous le feriez avec Maven) plutôt que les dépendances de la tâche (qui est ce que inspect tree s'affiche), vous devrez alors utiliser le plugin sbt-dependency-graph .

Ajoutez les éléments suivants à votre projet/plugins.sbt (ou au plugins.sbt global).

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

Vous avez ensuite accès à la commande dependencyTree et à d’autres.

125
OrangeDog

Si vous souhaitez afficher les dépendances de la bibliothèque , vous pouvez utiliser le plug-in coursier: https://github.com/ coursier/coursier/blob/master/doc/FORMER-README.md # arbre-d'impression

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 celle de l’impression d’arbres. Il est conçu pour des téléchargements de dépendance rapides et simultanés. Mais c'est agréable et peut être ajouté à presque tous les projets, alors je pense que cela vaut la peine d'être mentionné.

16
VasiliNovikov

J'ai essayé d'utiliser le plug-in "net.virtual-void" % "sbt-dependency-graph" Mentionné ci-dessus et j'ai obtenu 9 lignes comme sortie (il y a beaucoup de lignes vides et de doublons) par rapport à environ 180 lignes (exactement une ligne pour chaque dépendance dans mon projet) comme sortie dans Maven. mvn dependency:tree Sortie. J'ai donc écrit un wrapper sbt tâche pour cet objectif Maven, un bidouillage moche mais qui 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".!
}
3
MaxNevermind