ใช้ gradle เพื่อค้นหาต้นไม้ที่ต้องพึ่งพา


542

เป็นไปได้หรือไม่ที่จะใช้ gradle สร้างต้นไม้ขึ้นอยู่กับอะไร?

ฉันมีโครงการและต้องการทราบการอ้างอิงทั้งหมดดังนั้นฉันจึงสามารถตัดมันเล็กน้อยด้วยการประกาศล่วงหน้าเป็นต้น



@OliverCharlesworth โปรดใช้ปุ่มปิดเพื่อทำเครื่องหมายคำตอบซ้ำ
030

1
@ user3286701 คุณอาจยอมรับคำตอบอย่างใดอย่างหนึ่งหรือไม่
030

5
gradle dependenciesควรทำงาน. มันบ้าว่าทุกคนgradlew app:dependenciesอาจจะเป็นเพราะ Android
prayagupd

2
@prayagupd นี่ควรเป็นคำตอบ คำถามเกี่ยวกับการไล่ระดับสี หลังจากอ่านคำตอบที่ได้รับการจัดอันดับสูงฉันเปิด terminal และ cd'ed ไปยังไดเรกทอรีของโครงการทั่วไปที่ใช้ gradle ฉันดำเนินการ 'แอป gradle: การอ้างอิง' และได้รับข้อผิดพลาด 'Build failed' แม้ว่าฉันจะไม่ได้วางแผนจะสร้างอะไรก็ตาม โครงการของฉันสร้างได้ดีและฉันแค่ต้องการเห็นการพึ่งพา
ka3ak

คำตอบ:


604

สำหรับ Android ใช้บรรทัดนี้

 gradle app:dependencies

หรือถ้าคุณมีกระดาษห่อแรเงา:

./gradlew app:dependencies

appโมดูลโครงการของคุณอยู่ที่ไหน

นอกจากนี้หากคุณต้องการที่จะตรวจสอบว่ามีอะไรบางอย่างcompileกับtestCompileVS androidTestCompileพึ่งพาเช่นเดียวกับสิ่งที่จะดึงมันใน:

./gradlew :app:dependencyInsight --configuration compile --dependency <name>
./gradlew :app:dependencyInsight --configuration testCompile --dependency <name>
./gradlew :app:dependencyInsight --configuration androidTestCompile --dependency <name>

10
อาฉันต้องใส่ชื่อโมดูลที่นั่น นั่นคือเหตุผล ... ขอบคุณ!
Jenix

เพิ่งเริ่มเรียนระดับปริญญาตอนนี้จึงสับสนเล็กน้อย ฉันสามารถใช้ gradlew เป็น gradle ได้หรือไม่ฉันหมายถึงฉันสามารถป้อนตัวเลือก / คำสั่งเดียวกับ gradlew ด้วย gradlew ได้หรือไม่
Jenix

1
@Jenix ใช่ถ้าคุณใช้ wrapper ใช้./gradlewแทนgradle
Chad Bingham

2
ฉันได้รับข้อผิดพลาดProject 'app' not found in root projectเมื่อเรียกใช้คำสั่งเหล่านี้ อย่างไรก็ตามการแก้ปัญหา Benjaminsทำงาน
krock

5
ในความเป็นจริง./gradlew :dependenciesจะได้ผล มันจะแสดงรายการการพึ่งพาสำหรับทุกโครงการของคุณ แต่มันง่ายที่จะหาสิ่งที่ถูกต้อง
dirkjot

240

gradle dependenciesคุณสามารถแสดงแผนภูมิการอ้างอิงที่มีคำสั่ง สำหรับข้อมูลเพิ่มเติมให้ตรวจสอบส่วนที่11.6.4 การแสดงรายการการพึ่งพาโครงการในคู่มือผู้ใช้ออนไลน์


2
เมื่อฉันทำสิ่งนี้กับโครงการ Android ของฉันสิ่งที่ฉันได้รับคือผลลัพธ์: pastebin.com/fHFigAuYคำแนะนำ?
Nilzor

3
@Nilzor คุณอาจใช้งานคำสั่งในไดเรกทอรีที่ไม่ถูกต้อง (ที่ไม่มีbuild.gradleไฟล์) หรือไฟล์บิลด์ของคุณไม่ได้ใช้ปลั๊กอินใด ๆ
Benjamin Muschko

6
คุณสามารถได้รับการอ้างอิงสำหรับโครงการที่ระบุโดยใช้ gradle: project: dependencies
mbonnin

2
ปลั๊กอิน Android Studio - ดู Gradleเพื่อวิเคราะห์การพึ่งพา
Jignesh Patel

3
หากคุณใช้เสื้อคลุม:./gradlew dependencies
ScrappyDev

152

หากคุณพบว่ายากที่จะสำรวจเอาท์พุทคอนโซลของgradle dependenciesคุณสามารถเพิ่มปลั๊กอินรายงานโครงการ :

apply plugin: 'project-report'

และสร้างรายงาน HTML โดยใช้:

$ ./gradlew htmlDependencyReport

รายงานปกติสามารถพบได้ใน build/reports/project/dependencies/index.html

ดูเหมือนว่านี้: ป้อนคำอธิบายรูปภาพที่นี่


2
สำหรับฉันมันเป็นเพียงgradle htmlDependencyReport
Richard Tingle

2
สิ่งนี้ใช้ไม่ได้กับโปรเจ็กต์หลายโมดูล ฉันเพิ่งเห็นและว่างเปล่ารายการ
Adam Arold

1
หาที่ดี ปลั๊กอินจริงไม่ทางdocs.gradle.org/current/userguide/project_report_plugin.html
RUX

78

ใน Android Studio (อย่างน้อยตั้งแต่ v2.3.3) คุณสามารถเรียกใช้คำสั่งได้โดยตรงจาก UI:

คลิกที่แท็บGradleจากนั้นดับเบิลคลิกที่: yourmodule -> Tasks -> android -> androidDependencies

ต้นไม้จะปรากฏในแท็บGradle Console

ภาพมีค่าหนึ่งพันคำ


1
ฉันจะได้รับมุมมอง "โครงการ gradle" ได้อย่างไร
user3526

1
@ user3526 คลิกที่แท็ก "gradle" ที่ด้านขวาของหน้าจอ ดูภาพที่แนบมาสำหรับการอ้างอิง
Nicolás Carrasco

2
ฉันพบว่าสิ่งนี้สร้างรายการแบบเรียบใน AS 3.2.0 แทนที่จะเป็นทรี ตัวแปรบรรทัดคำสั่งสร้างต้นไม้อย่างไรก็ตาม
Tom

5
@Tom ทำงาน 'depencies' ภายใต้หมวดหมู่ 'help' ไม่ใช่ 'android' มันแสดงให้เห็นว่าเป็นต้นไม้
Maxim Berezovsky

27

บ่อยครั้งที่สมบูรณ์test, compileและandroidTestCompileการพึ่งพากราฟมากเกินไปในการตรวจสอบร่วมกัน หากคุณต้องการcompileกราฟการพึ่งพาคุณสามารถใช้:

./gradlew app:dependencies --configuration compile

ที่มา: เอกสาร Gradle ส่วน 4.7.6

หมายเหตุ: compileได้รับการคัดค้านในรุ่นล่าสุดของ Gradle และในรุ่นที่ผ่านมามากขึ้นคุณจะได้รับคำแนะนำที่จะเปลี่ยนทุกที่ที่คุณอ้างอิงไปcompile implementationโปรดดูคำตอบนี้ที่นี่


4
เพียงแค่ทราบ: รวบรวมได้เลิกแล้วตอนนี้ผู้คนควรจะย้ายไปใช้งาน
reinaldomoreira

25

หากคุณต้องการที่จะเห็นภาพการอ้างอิงของคุณในกราฟที่คุณสามารถใช้gradle พึ่งพากราฟกำเนิดปลั๊กอิน

โดยทั่วไปเอาต์พุตของปลั๊กอินนี้สามารถพบได้ในไดเร็กทอรีbuild / reports / dependency-graphและมีสามไฟล์ (.dot | .png | .svg) หากคุณใช้ปลั๊กอินเวอร์ชัน0.5.0

ตัวอย่างกราฟแสดงการพึ่งพาในแอปจริง ( Chess Clock ):

กราฟ


เฮ้เดวิดฉันทำตามที่บอกในคำแนะนำปลั๊กอิน ฉันใช้ปลั๊กอินในโครงการ gradle แต่ฉันไม่เห็นโฟลเดอร์รายงานใด ๆ ในไดเรกทอรีสร้าง มีอะไรที่เราต้องทำนอกเหนือจากการสร้างและเรียกใช้โครงการหรือไม่
Rushi M Thakker

ปลั๊กอินนี้ไม่แสดงรุ่นที่ขึ้นต่อกันและความขัดแย้ง เช่นนี้สำหรับ Maven; github.com/janssk1/maven-graph-plugin/wiki/
คู่มือ

18

สำหรับ Android ให้พิมพ์สิ่งนี้ในเทอร์มินัล

gradlew app:dependencies

มันจะแสดงรายการการพึ่งพาทั้งหมดและรายการที่มีเวอร์ชันที่ใหม่กว่าเพื่อให้คุณอัพเกรดเช่น

com.android.support:customtabs:26.1.0 -> 27.1.1 (*)

15

สิ่งต่าง ๆ ก้าวไปข้างหน้าใน Gradle ดังนั้นฉันเชื่อว่าคำถามนี้จะเป็นคำตอบที่ดีกว่า
ตั้งแต่ Gradle 4.3 จะมีการเปิดตัว" build scan " ข้อมูลที่เกี่ยวข้องทั้งหมดมีอยู่ในเอกสาร Gradle ( 1 , 2 ) สำหรับฉันตอนนี้ดูเหมือนจะเป็นวิธีที่ง่ายที่สุดในการตรวจสอบการอ้างอิงของคุณ (และโดยทั่วไปงานสร้างของคุณ) อย่างชัดเจนเป็นระเบียบ

มันง่ายมากที่จะสร้างเพียงแค่รัน:

gradle build --scan  

(หรือ./gradlew build --scanถ้าคุณใช้กระดาษห่อ)

สิ่งนี้จะสร้างลิงค์ที่สร้างแบบสุ่มซึ่งคุณสามารถดูการสแกนของคุณได้ เมื่อเปิดลิงก์นั้นคุณจะต้องป้อนอีเมลของคุณและควบคุมการเชื่อมโยงเช่น: แบ่งปันหรือลบ มีข้อมูลจำนวนมากเกี่ยวกับงานสร้างของคุณไม่ใช่แค่การอ้างอิง คุณสามารถดูการพึ่งพาลำดับชั้นของพวกเขาพื้นที่เก็บข้อมูลที่ใช้ในการรับพวกเขา แต่ยังมีสิ่งอื่น ๆ อีกมากมายเกี่ยวกับการสร้างของคุณคือประสิทธิภาพ (ซึ่งเป็นที่สนใจในการสร้างคอมเพล็กซ์ขนาดใหญ่) การทดสอบของคุณ การกำหนดค่าระบบซึ่งใช้ JDK และ JVM ขนาดฮีพสูงสุด ฯลฯ

นี่คือหน้าจอพิมพ์จากโครงการจำลอง:

สร้างตัวอย่างการสแกน

การสแกนบิลด์เป็นบันทึกที่แชร์ได้ของบิลด์ที่ให้ข้อมูลเชิงลึกเกี่ยวกับสิ่งที่เกิดขึ้นและสาเหตุ คุณสามารถสร้างบิลด์สแกนได้ที่ scan.gradle.com ฟรี

อย่างไรก็ตามโปรดทราบว่าข้อมูลสำหรับกระบวนการสร้างของคุณจะถูกส่งไปยังเซิร์ฟเวอร์ Gradle คุณสามารถควบคุมได้อย่างสมบูรณ์ในการลบเมื่อตรวจสอบเสร็จแล้ว

สุดท้ายคุณสามารถใช้ build scan ด้วย Gradle เวอร์ชั่นที่เก่ากว่า 4.3 ได้เช่นกันคุณเพียงแค่เพิ่มปลั๊กอินการสแกนใน buildscript ของคุณเอง

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

เมื่อดำเนินgradle build --scanการข้อความต่อไปนี้จะปรากฏขึ้น:

Publishing a build scan to scans.gradle.com requires accepting the Gradle
Terms of Service defined at https://gradle.com/terms-of-service. Do you
accept these terms? [yes, no]

คุณต้องเขียนอย่างชัดเจนyesและจากนั้นข้อความจะดำเนินต่อไป:

Publishing build scan...  
https://gradle.com/s/a12en0dasdu

2) ใน Gradle Enterprise คุณสามารถโฮสต์การสแกน gradle build ในเซิร์ฟเวอร์ของคุณเอง อย่างไรก็ตามฉันไม่มีประสบการณ์ในเรื่องนี้และแนวทางที่เสนอของฉันเกี่ยวกับการแจกจ่าย Gradle มาตรฐานโดยใช้เซิร์ฟเวอร์ของ Gradle สำหรับการสแกนแบบบิลด์ของคุณ

3) Gradle ส่งเสริมการสแกนบิวด์เป็นวิธีจัดการกับปัญหาบิลด์ของคุณ


11
ขออภัยที่จะลงคะแนนคำตอบ แต่ IMO มันไม่ตอบคำถามและมันไม่ได้เตือนอย่างชัดเจนว่า gradle build --scanคุณเผยแพร่รายละเอียดงานสร้างของคุณที่ไหนสักแห่งบนอินเทอร์เน็ต - และเพื่อลบคุณต้องเชื่อมโยงกับที่อยู่อีเมลที่ใช้งานได้
มิคาล

1
เฮ้มีคาลคุณสามารถลงคะแนนถ้าคุณรู้สึกอย่างนั้น อย่างไรก็ตามฉันต้องถามคุณลองไหม? เมื่อดำเนินการ gradle build --scanใน cmd Publishing a build scan to scans.gradle.com requires accepting the Gradle Terms of Service defined at https://gradle.com/terms-of-service. Do you accept these terms? [yes, no]คุณจะได้รับการแจ้งเตือน: yesคุณต้องเขียนด้วยตนเอง หลังจากนั้นคุณจะได้รับข้อความ: Publishing build scan... https://gradle.com/s/a12en0dasdu(ใส่ลิงค์ประเภทเดียวกันแบบสุ่ม) ดังนั้นฉันเชื่อว่ามันเตือนคุณอย่างเหมาะสมก่อน (1/2)
ทดลอง

1
คุณสามารถเยี่ยมชมลิงค์และลบการสแกนทันทีโดยไม่ต้องมีอีเมลหรืออะไร เป็นคำตอบผมเชื่อว่ามันไม่ตอบคำถาม ในความเป็นจริงมันจะแสดงข้อมูลเพิ่มเติมเกี่ยวกับการขึ้นต่อกันของคุณ (และเพิ่มไมล์พิเศษ: ข้อมูลเพิ่มเติมสำหรับงานสร้างทั้งหมด) เมื่อเปรียบเทียบกับวิธีอื่น ๆ หากคุณไม่พบว่าสิ่งที่คุณชอบนั้นไม่เป็นไร แต่มันเป็นเครื่องมือที่ครบวงจรที่สุดสำหรับงานดังนั้นมันจึงเป็นสิ่งที่มีค่า ในที่สุดมันก็เลื่อนขั้นโดย Gradle มันเป็นคู่มือแรกของพวกเขาอย่างแท้จริง(2/2)
tryman

@Michal ขออภัยลืมแท็กคุณก่อนดังนั้นคุณอาจไม่เห็นความคิดเห็นของฉัน (ผมยังแก้ไขการโพสต์แสดงความคิดเห็นที่จะรวมกับที่ผมตอบให้กับคุณ.)
tryman

2
ฉันยังไม่ได้ลอง - ขอบคุณสำหรับการชี้แจงเกี่ยวกับการยอมรับเงื่อนไข ฉันลบ -1
มิคาล

9

ใน Android Studio

1) เปิดเทอร์มินัลและตรวจสอบว่าคุณอยู่ในโฟลเดอร์รูทของโปรเจ็กต์

2) เรียกใช้./gradlew app:dependencies (หากไม่ได้ใช้ตัวตัดระดับสีให้ลอง gradle app:dependencies)

โปรดทราบว่าการรัน./gradle dependenciesจะให้โครงสร้างการพึ่งพาของโฟลเดอร์รูทของโปรเจ็กต์ของคุณเท่านั้นดังนั้นเมื่อกล่าวถึงแอพในลักษณะด้านบนนั่น ./gradlew app:dependenciesคือสิ่งสำคัญ


1
สำหรับฉันมันทำงานโดยไม่ต้อง "./" เช่นนั้น: แอป gradlew: การพึ่งพา
Gilad Levinson

7

ฉันก็พบว่ามีประโยชน์ในการทำงานนี้:

./gradlew dI --dependency <your library>

สิ่งนี้แสดงให้เห็นว่ามีการแก้ไขการอ้างอิงอย่างไร ( dependencyInsight) และช่วยคุณแก้ไขข้อบกพร่องในที่ที่คุณต้องการบังคับหรือแยกไลบรารีในของคุณbuild.gradle

โปรดดู: https://docs.gradle.org/current/userguide/tutorial_gradle_command_line.html


ฉันลองสิ่งนี้เหมือนที่คุณพูด แต่มันใช้งานไม่ได้ :( stackoverflow.com/questions/49646103/…
loki

7

โปรดทราบว่าคุณอาจต้องทำบางอย่างเช่น./gradlew <module_directory>:<module_name>:dependenciesถ้าโมดูลมีไดเรกทอรีพิเศษก่อนถึง build.gradle เมื่อสงสัยให้ทำ./gradlew tasks --allเพื่อตรวจสอบชื่อ


7

สำหรับฉันมันเป็นเพียงคำสั่งเดียว

ใน build.gradle เพิ่ม plugin

apply plugin: 'project-report'

จากนั้นไปที่ cmd และเรียกใช้คำสั่งต่อไปนี้

./gradlew htmlDependencyReport

นี่ให้รายงาน HTML กับฉันรายงาน WOW Html 💕

นั่นคือเจ้านายของฉันทั้งหมด


Devstr นี้ได้รับคำตอบแล้ว
brute_force

ใช่ขอบคุณ @brute_force ในเวลานั้นฉันไม่สามารถมองเห็นได้ คุณต้องการอะไรลบคำตอบของฉันออก
Dupinder Singh

1

สำหรับ Gradle รุ่นล่าสุด (ฉันทดสอบกับเวอร์ชั่น 6.4.1):

gradle dependencies --configuration compileClasspath

หรือถ้าคุณใช้ Gradle Wrapper:

gradlew dependencies --configuration compileClasspath

0

หากคุณต้องการการอ้างอิงทั้งหมดในไฟล์เดียวที่ส่วนท้ายภายในสองขั้นตอน เพิ่มสิ่งนี้ลงbuild.gradle.ktsในรูทของโครงการ:

project.rootProject.allprojects {
    apply(plugin="project-report")

    this.task("allDependencies", DependencyReportTask::class) {
        evaluationDependsOnChildren()
        this.setRenderer(AsciiDependencyReportRenderer())
    }

}

จากนั้นนำไปใช้:

./gradlew allDependencies | grep '\-\-\-' | grep -Po '\w+.*$' | awk -F ' ' '{ print $1 }' | sort | grep -v '\{' | grep -v '\[' | uniq | grep '.\+:.\+:.\+'

สิ่งนี้จะให้การพึ่งพาทั้งหมดในโครงการและโครงการย่อยของคุณพร้อมกับการอ้างอิงจากบุคคลที่สามทั้งหมด

หากคุณต้องการทำสิ่งนี้ด้วยวิธีการเขียนโปรแกรมคุณจะต้องใช้ตัวเรนเดอร์แบบกำหนดเองของการพึ่งพา - คุณสามารถเริ่มต้นโดยขยายส่วนAsciiDependencyReportRendererที่พิมพ์กราฟ ascii ของการขึ้นต่อกันตามค่าเริ่มต้น

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