วิธีดูแผนผังการพึ่งพาใน sbt?


92

ฉันกำลังพยายามตรวจสอบแผนผังการพึ่งพา SBT ตามที่อธิบายไว้ในเอกสารประกอบ :

sbt inspect tree clean

แต่ฉันได้รับข้อผิดพลาดนี้:

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

เกิดอะไรขึ้น? ทำไม SBT ไม่สร้างต้นไม้?


1
ดูคำตอบล่าสุดจาก@TheKojuEffectสำหรับ sbt> 1.4
UselesssCat

คำตอบ:


86

เมื่อเรียกใช้จากบรรทัดคำสั่งแต่ละอาร์กิวเมนต์ที่ส่งไปยัง sbt ควรเป็นคำสั่งดังนั้นsbt inspect tree cleanจะ:

  • เรียกใช้inspectคำสั่ง
  • จากนั้นรันtreeคำสั่ง
  • จากนั้นcleanคำสั่ง

สิ่งนี้ล้มเหลวอย่างเห็นได้ชัดเนื่องจากinspectต้องมีการโต้แย้ง สิ่งนี้จะทำสิ่งที่คุณต้องการ:

sbt "inspect tree clean"

23
สิ่งที่แสดงการพึ่งพาไลบรารี ?? อย่าคิดอย่างนั้น
Prayagupd

2
มันใช้งานได้สำหรับฉันอันดับแรกฉันย้ายไปที่คอนโซล sbt และเรียกใช้คำสั่งตรวจสอบต้นไม้สะอาด ฉันมีต้นไม้ใหญ่แห่งการพึ่งพา
อาทิตย์

2
ฉันลองสิ่งนี้มันให้ต้นไม้ของสิ่งต่างๆ แต่ฉันไม่ได้ปรับไลบรารีภายนอกใด ๆ เช่นฉันค้นหา Akka ในผลลัพธ์ฉันไม่ได้แสดง Akka ใด ๆ ในคอนโซล มันแสดงต้นไม้ที่ไร้ประโยชน์ มันมีทุกอย่างเกี่ยวกับโมดูลและรายละเอียดท้องถิ่นและที่ขึ้นอยู่กับฉันเท่านั้น คำสั่งนี้ไม่มีประโยชน์ ได้โปรดช่วยฉันมีคำสั่งใด ๆ ที่ไม่ใช่เรื่องไร้สาระนี้ได้โปรด
อาทิตย์

2
@ ซัน: ดูคำตอบที่สองสำหรับวิธีรับการพึ่งพาไลบรารี maven / ivy ซึ่งเป็นสิ่งที่คุณกำลังมองหา inspect tree <foo>คำสั่งเป็นเรื่องเกี่ยวกับการตรวจสอบการอ้างอิงของงาน<foo>ในงานและการตั้งค่าระบบของ SBT ซึ่งบางครั้งก็มีประโยชน์ แต่แตกต่างอย่างสิ้นเชิง
gourlaysama

4
มันพิมพ์อะไรบางอย่างเหมือนต้นไม้ ไม่ควรเป็นคำตอบที่ยอมรับ
yerlilbilgin

156

หากคุณต้องการที่จะดูจริงอ้างอิงห้องสมุด (ตามที่คุณจะมี Maven) มากกว่าการอ้างอิงงาน (ซึ่งเป็นสิ่งที่inspect treeแสดง) แล้วคุณจะต้องการที่จะใช้SBT พึ่งพากราฟปลั๊กอิน

เพิ่มสิ่งต่อไปนี้ใน project / plugins.sbt ของคุณ (หรือ global plugins.sbt)

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

จากนั้นคุณจะสามารถเข้าถึงdependencyTreeคำสั่งและอื่น ๆ


19
สำหรับข้อมูลการพึ่งพาไลบรารีนอกจากนี้ยังมีรายงานการอ้างอิงโดยละเอียดที่สร้างโดย Ivy หลังจากทำเสร็จsbt updateแล้วให้เปิดรายงาน XML target/resolution-cache/reports/ในเบราว์เซอร์เช่น MSIE
รวย

15
ไม่มีทางที่จะแนะนำห้องสมุด? ฉันเริ่มคิดถึง Maven :(
Jas

5
@Jas Even Maven ทำสิ่งนี้ให้สำเร็จผ่านปลั๊กอินเพียงแค่ maven ที่คว้าปลั๊กอิน (org.apache.maven.plugins: maven-dependency-plugin) โดยอัตโนมัติเมื่อคุณเรียกใช้ dependency: tree
JMess

การอ้างอิงที่ถูกขับไล่และบรรทัดว่างทำให้ดูเหมือนขยะเมื่อเทียบกับผลลัพธ์ที่สะอาดของ maven
MaxNevermind

3
สำหรับ sbt 1.0 ขึ้นไปคุณต้องใช้เวอร์ชันนี้แทน: addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.10.0-RC1")หรือดูที่github.com/jrudolph/sbt-dependency-graphสำหรับเวอร์ชันล่าสุดและคำแนะนำ
silverbeak

21

หากคุณต้องการดูการอ้างอิงไลบรารีคุณสามารถใช้coursierปลั๊กอิน: https://github.com/coursier/coursier/blob/master/doc/FORMER-README.md#printing-trees

ตัวอย่างผลลัพธ์: ภาพ ข้อความ (ไม่มีสี): https://gist.github.com/vn971/3086309e5b005576533583915d2fdec4

โปรดทราบว่าปลั๊กอินมีลักษณะที่แตกต่างไปจากการพิมพ์ต้นไม้อย่างสิ้นเชิง ออกแบบมาเพื่อการดาวน์โหลดที่รวดเร็วและขึ้นต่อกันพร้อมกัน แต่ก็ดีและสามารถเพิ่มได้ในเกือบทุกโครงการดังนั้นฉันคิดว่ามันคุ้มค่าที่จะกล่าวถึง


@mjjaniec ขอบคุณ! ฉันจะใช้มันตอนนี้ เมื่อถึงเวลาที่เปลี่ยนแปลงหวังว่าเว็บไซต์จะมีรายการที่เหมาะสม / เสถียรสำหรับสิ่งนี้
VasiliNovikov

13

ด้วย sbt 1.4.0 dependencyTreeงานจะพร้อมใช้งานใน sbt โดยไม่ต้องใช้ปลั๊กอิน

sbt dependencyTree

sbt 1.4.0: https://github.com/sbt/sbt/releases/tag/v1.4.0


ขอบคุณ! เนื่องจาก sbt 1.4 นี่คือคำตอบที่ถูกต้อง คำตอบอื่น ๆ ทั้งหมดล้าสมัยไปแล้วไม่มากก็น้อย (ดังนั้นควรมีวิธีแท็กคำตอบที่ล้าสมัยหรืออะไรทำนองนั้น ... )
jcsahnwaldt Reinstate Monica

5

ฉันลองใช้"net.virtual-void" % "sbt-dependency-graph"ปลั๊กอินที่กล่าวถึงข้างต้นและได้รับ 9K บรรทัดเป็นเอาต์พุต (มีบรรทัดว่างและรายการที่ซ้ำกันจำนวนมาก) เมื่อเทียบกับ ~ 180 บรรทัด (หนึ่งบรรทัดสำหรับการอ้างอิงแต่ละรายการในโปรเจ็กต์ของฉัน) เป็นเอาต์พุตในmvn dependency:treeเอาต์พุตของ Maven ดังนั้นฉันจึงเขียน SBT เสื้อคลุมงานสำหรับว่าเป้าหมาย Maven, สับน่าเกลียด แต่การทำงาน:

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

รหัสของคุณมีประโยชน์มาก BTW หากใครพยายามเรียกใช้งานบน windows โปรดอย่าลืมเขียนเส้นทางที่แน่นอนmvn.cmdแทนที่จะเขียนเพียงอย่างเดียวmvn
nomadSK25
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.