Làm thế nào để xem cây phụ thuộc trong sbt?


91

Tôi đang cố gắng kiểm tra cây phụ thuộc SBT như được mô tả trong tài liệu :

sbt inspect tree clean

Nhưng tôi gặp lỗi này:

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

Chuyện gì thế? Tại sao SBT không xây dựng cái cây?


Xem câu trả lời mới nhất từ @TheKojuEffect cho sbt > 1.4
UselesssCat

Câu trả lời:


85

Khi chạy từ dòng lệnh , mỗi đối số được gửi đến sbt được coi là một lệnh, vì vậy sbt inspect tree cleansẽ:

  • chạy inspectlệnh,
  • sau đó chạy treelệnh,
  • sau đó là cleanlệnh

Điều này rõ ràng không thành công, vì inspectcần một đối số. Điều này sẽ làm những gì bạn muốn:

sbt "inspect tree clean"

22
Những gì nó hiển thị phụ thuộc thư viện ?? Đừng nghĩ vậy.
Prayagupd

2
Nó đang hoạt động đối với tôi, Đầu tiên, tôi chuyển sang bảng điều khiển sbt và chạy lệnh kiểm tra cây sạch . Tôi có một cây phụ thuộc lớn.
nhật

2
Tôi đã thử điều này, Nó cho một chút cây của sự vật. Nhưng tôi đã không tốt bất kỳ thư viện bên ngoài. tức là tôi tìm kiếm Akka trong đầu ra, tôi không hiển thị bất kỳ sự xuất hiện nào của Akka trong bảng điều khiển. Nó cho thấy một số cây vô dụng. Nó chỉ có tất cả về các mô-đun cục bộ và phụ thuộc của tôi và các chi tiết. Lệnh này vô dụng. Làm ơn giúp tôi bất kỳ lệnh nào hơn là điều vô nghĩa này.
nhật

2
@Sun: xem câu trả lời thứ hai để biết cách lấy các phụ thuộc thư viện maven / ivy , đó là những gì bạn đang tìm kiếm. Các inspect tree <foo>lệnh về kiểm tra sự phụ thuộc của nhiệm vụ <foo>trong nhiệm vụ & thiết lập hệ thống SBT, mà đôi khi hữu ích, nhưng hoàn toàn khác nhau.
diglaysama

4
Nó in một cái gì đó giống như một cái cây. không nên là câu trả lời được chấp nhận
yerlilbilgin

155

Nếu bạn thực sự muốn xem các phụ thuộc thư viện (như bạn làm với Maven) hơn là các phụ thuộc tác vụ (là những gì inspect treehiển thị), thì bạn sẽ muốn sử dụng plugin sbt-dependency-graph .

Thêm phần sau vào dự án / plugins.sbt của bạn (hoặc plugins.sbt toàn cầu).

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

Sau đó, bạn có quyền truy cập vào dependencyTreelệnh và các lệnh khác.


19
Đối với thông tin phụ thuộc thư viện, cũng có các báo cáo phụ thuộc chi tiết do Ivy tạo ra. Sau khi thực hiện sbt update, hãy mở báo cáo XML target/resolution-cache/reports/trong một trình duyệt như MSIE.
Giàu

15
không có cách nào mà không giới thiệu một thư viện? tôi bắt đầu nhớ maven :(
Jas

5
@Jas Thậm chí Maven hoàn thành điều này thông qua một plugin, nó chỉ là maven lấy plugin (org.apache.maven.plugins: maven-phụ thuộc-plugin) tự động khi bạn chạy phụ thuộc: cây
JMess

Các phụ thuộc bị loại bỏ và các dòng trống làm cho nó giống như một thứ rác thải so với đầu ra sạch của maven.
MaxNevermind

3
Đối với sbt 1.0 trở lên, bạn cần có phiên bản này thay thế: addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.10.0-RC1")Hoặc xem github.com/jrudolph/sbt-dependency-graph để biết hướng dẫn và phiên bản mới nhất.
silverbeak

21

Nếu bạn muốn xem các phụ thuộc của thư viện , bạn có thể sử dụng coursierplugin: https://github.com/coursier/coursier/blob/master/doc/FORMER-README.md#printing-trees

Ví dụ đầu ra: hình ảnh văn bản (không có màu): https://gist.github.com/vn971/3086309e5b005576533583915d2fdec4

Lưu ý rằng plugin có bản chất hoàn toàn khác với in cây. Nó được thiết kế để tải xuống phụ thuộc nhanh chóng và đồng thời. Nhưng nó rất hay và có thể được thêm vào hầu hết mọi dự án, vì vậy tôi nghĩ nó đáng được nhắc đến.


@mjjaniec cảm ơn! Tôi sẽ sử dụng nó ngay bây giờ. Khi nó thay đổi, hy vọng trang web sẽ có một mục nhập phù hợp / ổn định cho việc này.
VasiliNovikov

5

Tôi đã thử sử dụng "net.virtual-void" % "sbt-dependency-graph"plugin được đề cập ở trên và nhận được 9K dòng làm đầu ra (có nhiều dòng trống và trùng lặp) so với ~ 180 dòng (chính xác một dòng cho mỗi phụ thuộc trong dự án của tôi) là đầu ra trong mvn dependency:treeđầu ra của Maven . Vì vậy, tôi đã viết một nhiệm vụ trình bao bọc sbt cho mục tiêu Maven đó, một vụ hack xấu xí nhưng nó hoạt động:

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

mã của bạn thực sự hữu ích, BTW nếu có ai đang cố gắng chạy điều này trên windows thì xin đừng quên viết đường dẫn tuyệt đối mvn.cmdthay vì chỉ viếtmvn
nomadSK25

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.