¿Cómo ver el árbol de dependencia en sbt?


91

Estoy tratando de inspeccionar el árbol de dependencia SBT como se describe en la documentación :

sbt inspect tree clean

Pero me sale este error:

[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á mal? ¿Por qué SBT no construye el árbol?


Mire la última respuesta de @TheKojuEffect para sbt> 1.4
UselesssCat

Respuestas:


85

Cuando se ejecuta desde la línea de comando , se supone que cada argumento enviado a sbt es un comando, así sbt inspect tree cleanque:

  • ejecutar el inspectcomando,
  • luego ejecuta el treecomando,
  • entonces el cleancomando

Esto obviamente falla, ya que inspectnecesita un argumento. Esto hará lo que quieras:

sbt "inspect tree clean"

22
¿Qué muestra las dependencias de la biblioteca? No lo creo.
prayagupd

2
Me está funcionando. Primero, me moví a la consola sbt y ejecuté el comando inspeccionar árbol limpio . Tengo un gran árbol de dependencias.
Dom

2
Intenté esto, dando un pequeño árbol de cosas. Pero no multe a ninguna biblioteca externa. es decir, busco Akka en la salida, no mostré ninguna ocurrencia de Akka en la consola. Muestra algún árbol inútil. Tiene todo sobre mis módulos y detalles locales y dependientes solamente. Este comando es inútil. Por favor, ayúdame cualquier comando que no sea esta tontería por favor.
dom.

2
@Sun: vea la segunda respuesta sobre cómo obtener las dependencias de la biblioteca maven / ivy , que es lo que está buscando. El inspect tree <foo>comando trata de inspeccionar las dependencias de la tarea <foo>en el sistema de configuración y tareas de sbt, que a veces es útil, pero completamente diferente.
gourlaysama

4
Imprime algo parecido a un árbol. no debería ser la respuesta aceptada
yerlilbilgin

155

Si realmente desea ver las dependencias de la biblioteca (como lo haría con Maven) en lugar de las dependencias de tareas (que es lo que se inspect treemuestra), entonces querrá usar el complemento sbt-dependency-graph .

Agregue lo siguiente a su proyecto / plugins.sbt (o el global plugins.sbt).

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

Entonces tienes acceso al dependencyTreecomando y otros.


19
Para obtener información sobre la dependencia de la biblioteca, también están los informes de dependencia detallados generados por Ivy. Después de hacerlo sbt update, abra los informes XML target/resolution-cache/reports/en un navegador como MSIE.
Rich

15
de ninguna manera sin introducir una biblioteca? Empiezo a extrañar a Maven :(
Jas

5
@Jas Even Maven logra esto a través de un complemento, es solo que maven toma el complemento (org.apache.maven.plugins: maven-dependency-plugin) automáticamente cuando ejecuta dependency: tree
JMess

Las dependencias desalojadas y las líneas vacías hacen que parezca una basura en comparación con la salida limpia de maven.
MaxNevermind

3
Para sbt 1.0 y versiones posteriores, necesita esta versión en su lugar: addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.10.0-RC1")O eche un vistazo a github.com/jrudolph/sbt-dependency-graph para obtener la última versión e instrucciones.
silverbeak

21

Si desea ver las dependencias de la biblioteca , puede usar el coursiercomplemento: https://github.com/coursier/coursier/blob/master/doc/FORMER-README.md#printing-trees

Ejemplo de salida: imagen texto (sin colores): https://gist.github.com/vn971/3086309e5b005576533583915d2fdec4

Tenga en cuenta que el complemento tiene una naturaleza completamente diferente a la de imprimir árboles. Está diseñado para descargas de dependencias rápidas y simultáneas. Pero es bueno y se puede agregar a casi cualquier proyecto, así que creo que vale la pena mencionarlo.


@mjjaniec gracias! Lo usaré por ahora. Para cuando cambie, es de esperar que el sitio web tenga una entrada adecuada / estabilizada para esto.
VasiliNovikov

5

Intenté usar el "net.virtual-void" % "sbt-dependency-graph"complemento mencionado anteriormente y obtuve 9K líneas como salida (hay muchas líneas vacías y duplicados) en comparación con ~ 180 líneas (exactamente una línea para cada dependencia en mi proyecto) como salida en la salida de Maven mvn dependency:tree. Así que escribí una tarea de envoltura de sbt para ese objetivo de Maven, un truco feo pero funciona:

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

su código es realmente útil, por cierto, si alguien intenta ejecutar esto en Windows, no olvide escribir la ruta absoluta en mvn.cmdlugar de solo escribirmvn
nomadSK25

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.