Como ver a árvore de dependências no sbt?


92

Estou tentando inspecionar a árvore de dependência do SBT conforme descrito na documentação :

sbt inspect tree clean

Mas recebo este erro:

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

O que está errado? Por que o SBT não constrói a árvore?


1
Veja a última resposta de @TheKojuEffect para sbt> 1.4
UselesssCat

Respostas:


86

Quando executado a partir da linha de comando , cada argumento enviado para sbt deve ser um comando, então sbt inspect tree clean:

  • execute o inspectcomando,
  • então execute o treecomando,
  • então o cleancomando

Isso obviamente falha, pois inspectprecisa de um argumento. Isso fará o que você quiser:

sbt "inspect tree clean"

23
O que mostra as dependências da biblioteca ?? Acho que não.
prayagupd

2
Está funcionando para mim. Primeiro, mudei para o console sbt e executei o comando inspect tree clean . Eu tenho uma grande árvore de dependências.
Dom

2
Eu tentei isso, Está dando um pouco de árvore das coisas. Mas eu não multou nenhuma biblioteca externa. ou seja, procuro Akka na saída, não mostrei nenhuma ocorrência de Akka no console. Mostra alguma árvore inútil. Tem tudo sobre meus módulos e detalhes locais e dependentes apenas. Este comando é inútil. Por favor, me ajude qualquer comando do que esse absurdo, por favor.
Dom,

2
@Sun: veja a segunda resposta para saber como obter as dependências da biblioteca maven / ivy , que é o que você está procurando. O inspect tree <foo>comando é para inspecionar as dependências da tarefa <foo>no sistema de configuração e tarefas do sbt, que às vezes é útil, mas completamente diferente.
gourlaysama

4
Ele imprime algo como uma árvore. não deveria ser a resposta aceita
yerlilbilgin

156

Se você deseja realmente ver as dependências da biblioteca (como faria com o Maven) em vez das dependências da tarefa (que é o que inspect treeexibe), então você vai querer usar o gráfico sbt-dependency plugin .

Adicione o seguinte ao seu project / plugins.sbt (ou o plugins.sbt global).

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

Então você tem acesso ao dependencyTreecomando e outros.


19
Para obter informações de dependência de biblioteca, também existem os relatórios detalhados de dependência gerados pelo Ivy. Após fazer isso sbt update, abra os relatórios XML target/resolution-cache/reports/em um navegador como o MSIE.
Rich

15
de jeito nenhum sem apresentar uma biblioteca? começo a sentir falta de maven :(
Jas

5
@Jas Mesmo o Maven faz isso por meio de um plugin, é só que o maven pega o plugin (org.apache.maven.plugins: maven-dependency-plugin) automaticamente quando você executa dependency: tree
JMess

Dependências despejadas e linhas vazias fazem com que pareça um lixo em comparação com a saída limpa do maven.
MaxNevermind

3
Para sbt 1.0 e superior, você precisa desta versão: addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.10.0-RC1")Ou dê uma olhada em github.com/jrudolph/sbt-dependency-graph para a última versão e instruções.
silverbeak,

21

Se quiser ver as dependências da biblioteca , você pode usar o coursierplugin: https://github.com/coursier/coursier/blob/master/doc/FORMER-README.md#printing-trees

Exemplo de saída: imagem texto (sem cores): https://gist.github.com/vn971/3086309e5b005576533583915d2fdec4

Observe que o plugin tem uma natureza completamente diferente da impressão de árvores. Ele foi projetado para downloads de dependência rápidos e simultâneos. Mas é bom e pode ser adicionado a quase qualquer projeto, então acho que vale a pena mencionar.


@mjjaniec obrigado! Vou usar por agora. No momento em que mudar, esperançosamente o site terá uma entrada adequada / estabilizada para isso.
VasiliNovikov


5

Tentei usar o "net.virtual-void" % "sbt-dependency-graph"plugin mencionado acima e obtive 9 mil linhas como saída (há muitas linhas vazias e duplicatas) em comparação com ~ 180 linhas (exatamente uma linha para cada dependência em meu projeto) como saída na saída do Maven mvn dependency:tree. Então, escrevi uma tarefa de wrapper sbt para esse objetivo do Maven, um hack feio, mas 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".!
}

seu código é realmente útil, BTW, se alguém tentar executar isso no Windows, por favor, não se esqueça de escrever o caminho absoluto em mvn.cmdvez de apenas escrevermvn
nomadSK25
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.