Cách tìm / xóa các phụ thuộc không sử dụng trong Gradle


Câu trả lời:


72

CẬP NHẬT: 28-06-2016: Hỗ trợ Android cho người phụ thuộc không sử dụng

Vào tháng 6 năm 2017 , họ đã phát hành 4.0.0 version và đổi tên tên dự án gốc "gradle-lint-plugin"thành "nebula-lint-plugin". Họ cũng đã thêm hỗ trợ Android cho sự phụ thuộc không sử dụng .


Vào tháng 5 năm 2016 Gradle đã triển khai plugin Gradle lint để tìm và loại bỏ sự phụ thuộc không mong muốn

Plugin Gradle Lint: Tài liệu đầy đủ

Plugin Gradle Lint là một công cụ nói dối có thể cắm và cấu hình để xác định và báo cáo về các mẫu lạm dụng hoặc phản đối trong các tập lệnh Gradle và các tệp liên quan.

Plugin này có nhiều quy tắc khác nhau. Quy tắc phụ thuộc không sử dụng là một trong số đó. Nó có ba đặc điểm cụ thể.

  1. Loại bỏ các phụ thuộc không sử dụng.
  2. Thúc đẩy các phụ thuộc bắc cầu được sử dụng trực tiếp bởi mã của bạn để rõ ràng phụ thuộc đơn hàng đầu tiên.
  3. Thay đổi vị trí phụ thuộc vào cấu hình 'chính xác'.

Để áp dụng quy tắc, thêm:

gradleLint.rules += 'unused-dependency'

Chi tiết về Quy tắc phụ thuộc không sử dụng được đưa ra trong phần cuối cùng.

Để áp dụng plugin Gradle lint:

buildscript { repositories { jcenter() } }
plugins {
  id 'nebula.lint' version '0.30.2'
}

Cách khác:

buildscript {
  repositories { jcenter() }
  dependencies {
    classpath 'com.netflix.nebula:gradle-lint-plugin:latest.release'
  }
}

apply plugin: 'nebula.lint'

Xác định quy tắc nào bạn muốn chống lại:

gradleLint.rules = ['all-dependency'] // Add as many rules here as you'd like

Đối với bản dựng doanh nghiệp, chúng tôi khuyên bạn nên xác định quy tắc lint trong tập lệnh init.gradle hoặc trong tập lệnh Gradle được bao gồm thông qua Gradle áp dụng từ cơ chế.

Đối với các dự án đa mô hình, chúng tôi khuyên bạn nên áp dụng plugin trong một allprojectskhối:

allprojects {
  apply plugin: 'nebula.lint'
  gradleLint.rules = ['all-dependency'] // Add as many rules here as you'd like
}


Chi tiết về Quy tắc phụ thuộc không sử dụng được đưa ra trong phần này

Để áp dụng quy tắc, thêm:

gradleLint.rules += 'unused-dependency'

Quy tắc kiểm tra các nhị phân được biên dịch phát ra từ các bộ nguồn dự án của bạn để tìm các tham chiếu lớp và khớp các tham chiếu đó với các phụ thuộc mà bạn đã khai báo trong khối phụ thuộc của bạn .

Cụ thể, quy tắc thực hiện các điều chỉnh sau đây cho các phụ thuộc:

1. Loại bỏ các phụ thuộc không sử dụng

  • Các lọ kiểu gia đình như com.amazonaws: aws-java-sdk bị xóa, vì chúng không chứa bất kỳ mã nào

2. Thúc đẩy các phụ thuộc bắc cầu được mã của bạn sử dụng trực tiếp để phụ thuộc vào thứ tự rõ ràng

  • Điều này có tác dụng phụ trong việc phá vỡ các tệp JAR kiểu gia đình, như com.amazonaws: aws-java-sdk, vào các phần mà bạn thực sự đang sử dụng và thêm chúng làm phụ thuộc đơn hàng đầu tiên

3. Thay đổi phụ thuộc vào cấu hình 'chính xác'

  • Webjars được chuyển đến cấu hình thời gian chạy
  • Các tệp JAR không chứa bất kỳ lớp nội dung nào bên ngoài META-INF được chuyển sang thời gian chạy
  • 'xerces', 'xercesImpl', 'xml-apis' phải luôn luôn nằm trong phạm vi thời gian chạy
  • Các nhà cung cấp dịch vụ (các tệp JAR chứa META-INF / dịch vụ) như mysql-Connector-java được chuyển sang thời gian chạy nếu không có bất kỳ tham chiếu thời gian biên dịch có thể chứng minh nào
  • Phụ thuộc được chuyển đến cấu hình bộ nguồn cao nhất có thể. Ví dụ: 'Junit' được chuyển sang testCompile trừ khi có sự phụ thuộc rõ ràng vào nó trong tập hợp nguồn chính (hiếm).


CẬP NHẬT: Các plugin trước

Để biết thông tin của bạn, tôi muốn chia sẻ về các plugin trước đó

  1. Plugin Gradle tìm thấy các phụ thuộc không được sử dụng, được khai báo và chuyển tiếp là com.github.nullstress.dependency-phân tích

Nhưng phiên bản mới nhất 1.0.3 của nó được tạo ra vào ngày 23 tháng 12 năm 2014 . Sau đó không có bất kỳ cập nhật nào.

Lưu ý: Nhiều kỹ sư của chúng tôi đang bị nhầm lẫn về plugin này vì họ chỉ cập nhật số phiên bản, không có gì khác.


Gradle-lint-plugin có tương thích với Android không?
Jaythakes

@Jaythaking có. Bạn có thể đi qua liên kết này: tools.android.com/tech-docs/new-build-system/ mẹo . Hy vọng nó sẽ làm rõ bạn.
SkyWalker

@Jaythaking - vừa thêm hỗ trợ thử nghiệm cho các phụ thuộc không sử dụng Android ngày hôm nay với phiên bản 4.0.0
jkschneider

4
Đáng buồn là plugin này không hoạt động với dsl kotlin. Họ không có kế hoạch hỗ trợ nó.
tuyết rơi

3
Nó cũng không làm việc với các cấu hình gradle mới (ví dụ: implementationapi), và thậm chí tồi tệ hơn, khuyên bạn thay đổi từ những cái mới để những người NỮA cũ (ví dụ: compile, testCompile, vv).
Laurence Gonsalves

8

Tôi đã có rất nhiều may mắn khi sử dụng Plugin Phân tích phụ thuộc Gradle . Để bắt đầu với nó, hãy thêm hai điều sau vào tập lệnh xây dựng Gradle của bạn.

buildscript {
    repositories {
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath "com.github.nullstress:DependencyAnalysisPlugin:1.0.3"
    }
}

apply plugin: "dependencyAnalysis"

Một khi những cái đó được đặt ra, chạy gradle analyze. Nếu có các phụ thuộc không được sử dụng, bạn sẽ gặp lỗi xây dựng hiển thị đầu ra tương tự như văn bản bên dưới, cộng với danh sách các phụ thuộc không được sử dụng (cả khai báo và bắc cầu). Lỗi xây dựng thực sự tiện dụng nếu bạn muốn thực thi rằng không nên có các phụ thuộc không được sử dụng thông qua một bản dựng CI.

:foo:analyze FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':foo:analyze'.
> The project has unused declared artifacts

3
Tôi nhận được "Thực thi không thành công cho nhiệm vụ ': ứng dụng: phân tích'.> Dự án không áp dụng plugin java." Nếu tôi thêm "áp dụng plugin: 'java'" thì tôi được bảo là nó không tương thích với plugin ứng dụng Android hiện có. có ý kiến ​​gì không
Alex Black

Có vẻ như đó là một cái gì đó cụ thể với plugin ứng dụng Android. Tôi ước tôi có thể giúp, nhưng tôi không có kinh nghiệm với Android!
jstricker

Plugin có lỗi, chẳng hạn như khi bạn có cuộc gọi tĩnh đến một phụ thuộc, không được tính đến.
ToYonos

điều này dường như không được chấp nhận đối với plugin
kẻ nói dối

7

Dự án được đề cập trong các câu trả lời trước đó dường như đã chết. Tôi sử dụng phân tích phụ thuộc gradle . Thiết lập rất đơn giản:

buildscript {
  repositories {
    jcenter()
  }
  dependencies {
    classpath 'ca.cutterslade.gradle:gradle-dependency-analyze:1.0.3'
  }
}

apply plugin: 'ca.cutterslade.analyze'

Sau đó làm:

$ gradle analyzeDependencies

4
Tôi gặp phải lỗi này: 'Đồng bộ hóa lớp không thành công: Nhiệm vụ với tên' các lớp 'không tìm thấy trong dự án'
Pawan

Tôi nhận được stackOverflowException làm điều đó. Không có thông tin chính xác những gì gây ra điều này mặc dù. Tôi nghĩ rằng có thể có một vấn đề phụ thuộc vòng tròn ở đây nhưng nó sẽ là một ý tưởng tuyệt vời mà công cụ đã nói với tôi ở đâu.
SGal

1
@Pawan plugin này không hoạt động với các dự án Android và điều này sẽ không thay đổi sớm. Bằng chứng: github.com/wfhartford/gradle-dependency-analyze/issues/18
dieersamat


0

Lưu ý của biên tập viên: Câu trả lời này đã hết hạn. Xin vui lòng xem câu trả lời hàng đầu .

Bạn có thể thử plugin Gradle com.github.nullstress.dependency-phân tích

Xây dựng đoạn mã để sử dụng trong tất cả các phiên bản Gradle:

buildscript {
  repositories {
    jcenter()
  }
  dependencies {
    classpath "com.github.nullstress:DependencyAnalysisPlugin:1.0.3"
  }
}

apply plugin: "com.github.nullstress.dependency-analysis"

Xây dựng đoạn mã cho cơ chế plugin mới, ươm tạo, được giới thiệu trong Lớp 2.1:

plugins {
  id "com.github.nullstress.dependency-analysis" version "1.0.3"
}

Ngoài ra, có một chủ đề ( Có một Gradle tương đương với "mvn phụ thuộc: phân tích"? ) Trong diễn đàn Gradle về điều này.


Plugin này dường như là một dự án đã chết ... ít nhất là với phiên bản Gradle hiện tại.
cjstehno

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.