Sử dụng gradle để tìm cây phụ thuộc


542

Có thể sử dụng gradle để sản xuất một cây của những gì phụ thuộc vào những gì?

Tôi có một dự án và muốn tìm hiểu tất cả các phụ thuộc để tôi có thể cắt tỉa nó một chút với các tuyên bố chuyển tiếp, v.v.



@OliverCharlesworth vui lòng sử dụng nút đóng để đánh dấu câu trả lời là trùng lặp
030

1
@ user3286701 có lẽ bạn có thể chấp nhận một trong những câu trả lời?
030

5
gradle dependenciesnên làm việc. Thật điên rồ làm sao mọi người có gradlew app:dependencieslẽ vì Android.
nguyện

2
@prayagupd Đây phải là câu trả lời. Câu hỏi là về gradle. Sau khi đọc các câu trả lời được xếp hạng cao, tôi đã mở terminal và cd'ed vào thư mục của một dự án chung sử dụng gradle. Tôi đã thực hiện 'ứng dụng lớp: phụ thuộc' và gặp lỗi 'Xây dựng thất bại' mặc dù tôi không có kế hoạch xây dựng bất cứ điều gì. Dự án của tôi xây dựng tốt và tôi chỉ muốn xem các phụ thuộc.
ka3ak

Câu trả lời:


604

Đối với Android, hãy sử dụng dòng này

 gradle app:dependencies

hoặc nếu bạn có một lớp bao bọc:

./gradlew app:dependencies

appmô-đun dự án của bạn ở đâu .

Ngoài ra, nếu bạn muốn kiểm tra xem có thứ gì đó compileso testCompilevới androidTestCompilephụ thuộc cũng như cái gì đang kéo nó vào:

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

10
Ah, tôi phải đặt tên mô-đun ở đó. Đó là lý do ... Cảm ơn!
Jenix

Mới bắt đầu học lớp bây giờ, nên hơi bối rối. Tôi có thể coi gradlew là gradle, ý tôi là, tôi có thể nhập các tùy chọn / lệnh tương tự như gradlew không?
Jenix

1
@Jenix yeah, nếu bạn đang sử dụng trình bao bọc, chỉ cần sử dụng ./gradlewthay thếgradle
Chad Bingham

2
Tôi nhận được lỗi Project 'app' not found in root projectkhi chạy các lệnh này. Tuy nhiên, giải pháp vitamin đã làm việc.
krock

5
Trong thực tế ./gradlew :dependenciessẽ làm việc. Nó sẽ liệt kê các phụ thuộc cho tất cả các dự án của bạn, nhưng thật dễ dàng để tìm đúng.
dirkjot

240

Bạn có thể kết xuất cây phụ thuộc bằng lệnh gradle dependencies. Để biết thêm thông tin, hãy kiểm tra phần 11.6.4 Liệt kê các phụ thuộc của dự án trong hướng dẫn sử dụng trực tuyến.


2
Khi tôi làm điều này với dự án Android của mình, tất cả những gì tôi nhận được là đầu ra này: pastebin.com/fHFigAuY Gợi ý?
Nilzor

3
@Nilzor Bạn có thể đang thực thi lệnh trong thư mục sai (không chứa build.gradletệp) hoặc tệp xây dựng của bạn không áp dụng bất kỳ plugin nào.
Benjamin Muschko

6
bạn có thể nhận được các phụ thuộc cho một dự án cụ thể bằng cách sử dụng gradle: project: phụ thuộc
mbonnin

2
Plugin Android Studio - Chế độ xem Gradle để phân tích các phụ thuộc.
Jignesh Patel

3
Nếu bạn sử dụng trình bao bọc:./gradlew dependencies
ScrappyDev

152

Nếu bạn cảm thấy khó điều hướng đầu ra của bảng điều khiển gradle dependencies, bạn có thể thêm plugin Báo cáo dự án :

apply plugin: 'project-report'

Và tạo một báo cáo HTML bằng cách sử dụng:

$ ./gradlew htmlDependencyReport

Báo cáo thường có thể được tìm thấy trong build/reports/project/dependencies/index.html

Nó trông như thế này: nhập mô tả hình ảnh ở đây


2
Đối với tôi đó chỉ làgradle htmlDependencyReport
Richard Tingle

2
Điều này không làm việc cho các dự án đa mô hình. Tôi chỉ thấy và danh sách trống.
Adam Arold

1
Tuyệt vời tìm thấy. Plugin thực sự có nhiều cách hơn docs.gradle.org/civerse/userguide/project_Vport_plugin.html
ruX

78

Trong Android Studio (ít nhất là từ v2.3.3), bạn có thể chạy lệnh trực tiếp từ UI:

Nhấp vào tab Gradle và sau đó nhấp đúp chuột vào : yourmodule -> Nhiệm vụ -> android -> androidDependencies

Cây sẽ được hiển thị trong tab Bảng điều khiển Gradle

Một hình ảnh đáng giá ngàn lời nói


1
Làm thế nào để tôi có được chế độ xem "dự án gradle"?
dùng3526

1
@ user3526 nhấp vào thẻ "gradle" được tìm thấy ở bên phải màn hình của bạn. Nhìn vào hình ảnh đính kèm để tham khảo
Nicolás Carrasco

2
Tôi thấy rằng điều này tạo ra một danh sách phẳng trong AS 3.2.0, thay vì một cái cây. Các biến thể dòng lệnh tạo ra một cây tuy nhiên.
Tom

5
@Tom chạy 'nhiệm vụ' thuộc danh mục 'trợ giúp' chứ không phải 'android'. Nó hiển thị dưới dạng cây
Maxim Berezovsky

27

Thường thì hoàn thành test, compileandroidTestCompilesự phụ thuộc đồ thị là quá nhiều để kiểm tra lại với nhau. Nếu bạn chỉ muốn compilebiểu đồ phụ thuộc, bạn có thể sử dụng:

./gradlew app:dependencies --configuration compile

Nguồn: Tài liệu Gradle phần 4.7.6

Lưu ý: compileđã bị từ chối trong các phiên bản gần đây của Gradle và trong các phiên bản gần đây hơn, bạn nên chuyển tất cả các compilephụ thuộc của mình sang implementation. Xin vui lòng xem câu trả lời ở đây


4
chỉ là một lưu ý: biên dịch đã bị phản đối, bây giờ mọi người nên chuyển sang thực hiện
reinaldomoreira

25

Nếu bạn muốn trực quan hóa các phụ thuộc của mình trong một biểu đồ, bạn có thể sử dụng plugin tạo biểu đồ phụ thuộc lớp .

Nói chung, đầu ra của plugin này có thể được tìm thấy trong thư mục build / báo cáo / phụ thuộc-đồ thị và nó chứa ba tệp (.dot | .png | .svg) nếu bạn đang sử dụng 0.5.0 phiên bản của plugin.

Ví dụ về biểu đồ phụ thuộc trong một ứng dụng thực ( Cờ vua ):

đồ thị


Này David, tôi đã làm như được nói trong hướng dẫn plugin. Tôi đã áp dụng plugin trong lớp dự án nhưng tôi không thấy bất kỳ thư mục báo cáo nào trong thư mục xây dựng. Có bất cứ điều gì chúng ta cần phải làm ngoài việc xây dựng và chạy dự án?
Rushi M Thakker

Plugin này không hiển thị phiên bản phụ thuộc và xung đột. như thế này cho Maven; github.com/janssk1/maven-graph-plugin/wiki/Manual Điều này làm cho nó vô dụng ..
sytolk

18

Đối với Android, nhập cái này vào terminal

gradlew app:dependencies

Nó sẽ liệt kê tất cả các phụ thuộc và các phiên bản mới hơn để bạn nâng cấp như

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

15

Mọi thứ đã tiến lên ở Gradle vì vậy tôi tin rằng câu hỏi này xứng đáng với câu trả lời khác.
Kể từ Lớp 4.3, " quét xây dựng " đã được giới thiệu. Tất cả thông tin liên quan đều có sẵn trong tài liệu Gradle ( 1 , 2 ). Đối với tôi, đây dường như là cách dễ nhất để kiểm tra các phụ thuộc của bạn (và nói chung là bản dựng của bạn) một cách rõ ràng, có tổ chức.

Chúng rất dễ tạo, chỉ cần thực thi:

gradle build --scan  

(hoặc là ./gradlew build --scan nếu bạn sử dụng trình bao bọc)

Điều này tạo ra một liên kết được tạo ngẫu nhiên, nơi bạn có thể thấy quét của mình. Khi mở liên kết đó, bạn nhập email của mình và giành toàn quyền kiểm soát liên kết: vd. chia sẻ hoặc xóa nó. Nó đã có rất nhiều thông tin về bản dựng của bạn , không chỉ phụ thuộc. Bạn có thể thấy các phụ thuộc của mình, hệ thống phân cấp của chúng, kho lưu trữ được sử dụng để có được chúng nhưng cũng có rất nhiều thứ khác về bản dựng của bạn, cụ thể là hiệu suất của nó (được quan tâm trong các bản dựng phức tạp lớn), các bài kiểm tra của bạn, thậm chí cả đầu ra giao diện điều khiển và cấu hình hệ thống, mà JDK và JVM đã được sử dụng, kích thước heap tối đa, v.v.

Đây là một màn hình in từ một dự án giả:

Xây dựng ví dụ quét

Quét bản dựng là bản ghi có thể chia sẻ của bản dựng cung cấp thông tin chuyên sâu về những gì đã xảy ra và tại sao. Bạn có thể tạo bản quét xây dựng tại scans.gradle.com miễn phí.

Lưu ý, tuy nhiên, thông tin đó cho quá trình xây dựng của bạn sẽ được gửi đến các máy chủ Gradle. Bạn có toàn quyền kiểm soát để xóa nó khi bạn hoàn thành việc kiểm tra của mình.

Cuối cùng, bạn cũng có thể sử dụng quét bản dựng với các phiên bản Gradle sớm hơn 4.3, bạn chỉ cần thêm thủ công các plugin quét trong bản dựng của mình.

Chỉnh sửa :
Kết hợp một số phản hồi từ các bình luận một số ghi chú thêm:
1) Rất khó thực hiện việc này do nhầm lẫn hoặc không hiểu rằng một số thông tin cho bản dựng của bạn sẽ trực tuyến (riêng tư với bạn, với khả năng xóa nó, nhưng vẫn trực tuyến ).

Khi thực hiện gradle build --scanthông báo sau xuất hiện:

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]

Bạn phải viết rõ ràng yesvà sau đó tin nhắn tiếp tục:

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

2) Trong Gradle Enterprise, bạn có thể lưu trữ bản quét lớp xây dựng trong các máy chủ của riêng bạn. Tuy nhiên tôi không có kinh nghiệm trong việc này và cách tiếp cận được đề xuất của tôi là về phân phối Gradle tiêu chuẩn, sử dụng máy chủ của Gradle để quét bản dựng của bạn.

3) Gradle tự thúc đẩy các bản quét xây dựng là cách để giải quyết hầu hết các vấn đề xây dựng của bạn.


11
Xin lỗi vì đã hạ thấp câu trả lời, nhưng IMO không trả lời câu hỏi và nó không đủ cảnh báo rõ ràng rằng gradle build --scanbạn xuất bản chi tiết về bản dựng của bạn ở đâu đó trên internet - và để xóa nó, bạn phải liên kết nó với địa chỉ email đang hoạt động.
Michal

1
Này Michal, bạn được chào đón downvote nếu bạn cảm thấy như vậy. Tuy nhiên tôi phải hỏi, bạn đã thử chưa? Khi thực hiện gradle build --scantrong cmd, bạn được nhắc : 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]. Bạn phải tự viết yes. Ngay sau đó, bạn nhận được thông báo: Publishing build scan... https://gradle.com/s/a12en0dasdu(đặt ngẫu nhiên liên kết cùng loại). Vì vậy, tôi tin rằng nó không cảnh báo bạn thích hợp trước đây. (1/2)
tryman

1
Bạn có thể truy cập liên kết và xóa quét ngay lập tức mà không cần email hoặc bất cứ điều gì. Như một câu trả lời, tôi tin rằng nó trả lời câu hỏi . Trên thực tế, nó cho bạn thấy thông tin bổ sung về các phụ thuộc của bạn (và sẽ đi xa hơn: thông tin bổ sung cho toàn bộ bản dựng) so với các phương pháp khác. Nếu bạn không thấy nó theo ý thích của mình thì điều đó hoàn toàn ổn, nhưng nó (theo hiểu biết của tôi) là công cụ toàn diện nhất hiện nay cho công việc, vì vậy thật có giá trị khi nghĩ đến nó. Cuối cùng, nó được quảng bá bởi chính Gradle, nó thực sự là hướng dẫn đầu tiên của họ (2/2)
tryman

@Michal Xin lỗi, quên gắn thẻ bạn trước để bạn có thể không thấy nhận xét của tôi. (Tôi cũng đã chỉnh sửa bài đăng để kết hợp với các bình luận mà tôi đã trả lời cho bạn.)
tryman

2
Tôi đã không thử điều đó - cảm ơn vì đã làm rõ về việc chấp nhận các điều khoản. Tôi đã xóa -1.
Michal

9

Trong Studio Android

1) Mở terminal và đảm bảo bạn đang ở thư mục gốc của dự án.

2) Chạy ./gradlew app:dependencies (nếu không sử dụng trình bao bọc lớp, hãy thử gradle app:dependencies)

Lưu ý rằng việc chạy ./gradle dependenciessẽ chỉ cung cấp cho bạn cây phụ thuộc của thư mục gốc của dự án, vì vậy việc đề cập đến ứng dụng theo cách trên, nghĩa ./gradlew app:dependencieslà rất quan trọng.


1
đối với tôi nó hoạt động mà không có "./", như thế: ứng dụng gradlew: phụ thuộc.
Gilad Levinson

7

Tôi cũng thấy hữu ích để chạy này:

./gradlew dI --dependency <your library>

Điều này cho thấy mức độ phụ thuộc được giải quyết ( dependencyInsight) và giúp bạn gỡ lỗi vào nơi bạn cần buộc hoặc loại trừ các thư viện trongbuild.gradle

Xem: https://docs.gradle.org/civerse/userguide/tutorial_gradle_command_line.html


Tôi thử điều này như bạn nói nhưng nó không hoạt động :( stackoverflow.com/questions/49646103/NH
loki

7

Lưu ý rằng bạn có thể cần phải làm một cái gì đó như ./gradlew <module_directory>:<module_name>:dependenciesnếu mô-đun có thư mục bổ sung trước khi đến build.gradle của nó. Khi nghi ngờ, làm ./gradlew tasks --allđể kiểm tra tên.


7

Đối với tôi, nó chỉ đơn giản là một lệnh

trong build.gradle thêm plugin

apply plugin: 'project-report'

và sau đó vào cmd và chạy lệnh sau

./gradlew htmlDependencyReport

Điều này cho tôi một báo cáo HTML Báo cáo WOW Html

Đó là tất cả chúa tể của tôi.


Điều này đã được Devstr trả lời.
brute_force

Có, Thankyou @brute_force Vào thời điểm đó, nó không hiển thị với tôi. Bạn muốn gì, loại bỏ câu trả lời của tôi?
Dupinder Singh

1

Đối với các phiên bản gần đây của Gradle (Tôi đã thử nghiệm với phiên bản 6.4.1):

gradle dependencies --configuration compileClasspath

hoặc nếu bạn đang sử dụng Gradle Wrapper:

gradlew dependencies --configuration compileClasspath

0

Nếu bạn muốn tất cả các phụ thuộc trong một tệp ở cuối trong vòng hai bước. Thêm phần này vào thư build.gradle.ktsmục gốc của dự án của bạn:

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

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

}

Sau đó áp dụng:

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

Điều này sẽ cung cấp cho bạn tất cả các phụ thuộc trong dự án và các dự án phụ của bạn cùng với tất cả các phụ thuộc của bên thứ 3.

Nếu bạn muốn thực hiện việc này theo cách lập trình, thì bạn sẽ cần một trình kết xuất tùy chỉnh các phụ thuộc - bạn có thể bắt đầu bằng cách mở rộng AsciiDependencyReportRendererbiểu đồ in ascii của các phụ thuộc theo mặc định.

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.