Bagaimana cara melihat pohon ketergantungan di sbt?

91

Saya mencoba memeriksa pohon dependensi SBT seperti yang dijelaskan dalam dokumentasi :

sbt inspect tree clean

Tapi saya mendapatkan kesalahan ini:

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

Apa yang salah? Mengapa SBT tidak membangun pohonnya?

ceri
sumber
Lihat jawaban terbaru dari @TheKojuEffect untuk sbt> 1.4
UselesssCat

Jawaban:

85

Ketika dijalankan dari baris perintah , setiap argumen yang dikirim ke sbt seharusnya menjadi perintah, begitu sbt inspect tree cleanjuga dengan:

  • jalankan inspectperintah,
  • lalu jalankan treeperintahnya,
  • lalu cleanperintahnya

Ini jelas gagal, karena inspectmembutuhkan argumen. Ini akan melakukan apa yang Anda inginkan:

sbt "inspect tree clean"
gourlaysama
sumber
22
Apa itu menunjukkan ketergantungan perpustakaan ?? Jangan berpikir begitu.
prayagupd
2
Ini berfungsi untuk saya, Pertama, saya pindah ke konsol sbt dan menjalankan perintah inspeksi pohon bersih . Saya punya pohon besar ketergantungan.
Minggu
2
Saya mencoba ini, Ini memberi sedikit pohon hal. Tapi saya tidak mendenda perpustakaan eksternal. yaitu saya mencari Akka di output, saya tidak menunjukkan adanya Akka di konsol. Ini menunjukkan beberapa pohon yang tidak berguna. Itu memiliki semua tentang modul dan detail lokal dan dependen saya saja. Perintah ini tidak berguna. Tolong bantu saya perintah apa pun selain omong kosong ini.
Minggu
2
@ Sun: lihat jawaban kedua untuk cara mendapatkan dependensi library maven / ivy , yang Anda cari. The inspect tree <foo>perintah tentang memeriksa dependensi tugas <foo>dalam tugas & pengaturan sistem sbt, yang kadang-kadang berguna, tapi benar-benar berbeda.
gourlaysama
4
Ini mencetak sesuatu seperti pohon. seharusnya bukan jawaban yang diterima
yerlilbilgin
155

Jika Anda ingin benar-benar melihat dependensi library (seperti yang Anda lakukan dengan Maven) daripada dependensi tugas (yang inspect treeditampilkan), maka Anda akan ingin menggunakan plugin sbt-dependency-graph .

Tambahkan berikut ini ke project / plugins.sbt Anda (atau global plugins.sbt).

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

Kemudian Anda memiliki akses ke dependencyTreeperintah, dan lainnya.

OrangeDog
sumber
19
Untuk info ketergantungan perpustakaan, ada juga laporan ketergantungan rinci yang dihasilkan oleh Ivy. Setelah melakukannya sbt update, buka laporan XML target/resolution-cache/reports/di browser seperti MSIE.
Kaya
15
tidak mungkin tanpa memperkenalkan perpustakaan? saya mulai merindukan maven :(
Yak
5
@Jas Even Maven menyelesaikan ini melalui sebuah plugin, hanya saja maven mengambil plugin (org.apache.maven.plugins: maven-dependency-plugin) secara otomatis ketika Anda menjalankan dependensi: tree
JMess
Dependensi yang dihapus dan baris kosong membuatnya tampak seperti sampah dibandingkan dengan keluaran bersih maven.
MaxNevermind
3
Untuk sbt 1.0 dan yang lebih baru, Anda memerlukan versi ini: addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.10.0-RC1")Atau kunjungi github.com/jrudolph/sbt-dependency-graph untuk versi dan petunjuk terbaru.
silverbeak
21

Jika Anda ingin melihat dependensi perpustakaan , Anda dapat menggunakan coursierplugin: https://github.com/coursier/coursier/blob/master/doc/FORMER-README.md#printing-trees

Contoh keluaran: gambar teks (tanpa warna): https://gist.github.com/vn971/3086309e5b005576533583915d2fdec4

Perhatikan bahwa plugin memiliki sifat yang sama sekali berbeda dari pohon pencetakan. Ini dirancang untuk unduhan dependensi yang cepat dan bersamaan. Tapi itu bagus dan bisa ditambahkan ke hampir semua proyek, jadi menurut saya itu layak untuk disebutkan.

VasiliNovikov
sumber
@mjjaniec terima kasih! Saya akan menggunakannya untuk saat ini. Pada saat berubah, semoga situs web memiliki entri yang sesuai / stabil untuk ini.
VasiliNovikov
5

Saya mencoba menggunakan "net.virtual-void" % "sbt-dependency-graph"plugin yang disebutkan di atas dan mendapatkan 9K baris sebagai output (ada banyak baris kosong dan duplikat) dibandingkan dengan ~ 180 baris (persis satu baris untuk setiap dependensi dalam proyek saya) sebagai output dalam output Maven mvn dependency:tree. Jadi saya menulis tugas pembungkus sbt untuk tujuan Maven itu, peretasan yang jelek tetapi berhasil:

// 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
sumber
kode Anda sangat membantu, BTW jika ada yang mencoba menjalankan ini di windows maka jangan lupa untuk menulis jalur absolut mvn.cmdalih-alih hanya menulismvn
nomadSK25