Як знайти / видалити невикористані залежності в Gradle


Відповіді:


72

ОНОВЛЕННЯ: 28-06-2016: підтримка Android до невикористаної залежності

У червні 2017 року вони випустили 4.0.0 version і перейменували ім'я кореневого проекту "gradle-lint-plugin"на "nebula-lint-plugin". Вони також додали підтримку Android до невикористаної залежності .


У травні 2016 року Gradle реалізував плагін Lint lint для пошуку та усунення небажаної залежності

Плагін Gradle Lint: Повна документація

Плагін Gradle Lint - це підключається та настроюється лінійний інструмент для ідентифікації та звітування про закономірності нецільового використання або припинення роботи у сценаріях Gradle та пов'язаних з ними файлах.

Цей плагін має різні правила. Правило невикористаної залежності є одним із них. Він має три специфічні характеристики.

  1. Видаляє невикористані залежності.
  2. Сприяє перехідним залежностям, які використовуються безпосередньо вашим кодом для явних залежностей першого порядку.
  3. Переміщує залежності до "правильної" конфігурації.

Щоб застосувати правило, додайте:

gradleLint.rules += 'unused-dependency'

Деталі правила невикористаної залежності залежать від останньої частини.

Щоб застосувати плагін Gradle lint:

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

Як варіант:

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

apply plugin: 'nebula.lint'

Визначте, на які правила ви б хотіли покластись:

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

Для побудови підприємства ми рекомендуємо визначити правила lint у скрипті init.gradle або в скрипті Gradle, який включений через Gradle, застосовувати з механізму.

Для мультимодульних проектів рекомендуємо застосувати плагін у allprojectsблоці:

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


Деталі правила невикористаної залежності залежать від цієї частини

Щоб застосувати правило, додайте:

gradleLint.rules += 'unused-dependency'

Правило перевіряє складені бінарні файли, що виходять із наборів джерел вашого проекту, шукаючи посилання на клас та відповідає цим посиланням на залежності, які ви оголосили у своєму блоці залежностей .

Зокрема, правило вносить такі зміни в залежності:

1. Усуває невикористані залежності

  • Банки сімейного типу, як com.amazonaws: aws-java-sdk видаляються, оскільки вони не містять жодного коду

2. Сприяє перехідним залежностям, які використовуються безпосередньо вашим кодом, для явних залежностей першого порядку

  • Це має побічний ефект розбиття файлів JAR сімейного стилю, наприклад com.amazonaws: aws-java-sdk, на частини, які ви фактично використовуєте, та додавання їх як залежностей першого порядку

3. Переміщує залежності до "правильної" конфігурації

  • Веб-сервер переміщений до конфігурації виконання
  • Файли JAR, які не містять жодних класів та вмісту поза META-INF, переміщуються до режиму виконання
  • 'xerces', 'xercesImpl', 'xml-apis' завжди має бути визначений під час виконання
  • Постачальники послуг (файли JAR, що містять META-INF / послуги), такі як mysql-connector-java, переміщуються в режим виконання, якщо немає жодної доказової посилання на час компіляції
  • Залежності переміщуються до максимально можливої ​​конфігурації набору джерел. Наприклад, "junit" переміщується до testCompile, якщо тільки в основному наборі джерела немає явної залежності від нього (рідко).


ОНОВЛЕННЯ: Попередні плагіни

Для вашої доброї інформації я хочу поділитися про попередні плагіни

  1. Плагін Gradle, який знаходить невикористані залежності, оголошені та перехідні, це com.github.nullstress.dependency-аналіз

Але його остання версія 1.0.3 створена 23 грудня 2014 року . Після цього оновлення не відбувається.

NB: Багато наших інженерів плутають цей плагін, оскільки вони оновлювали лише номер версії, більше нічого.


Чи сумісний плагін gradle-lint з Android?
Джейтакінг

@Jaythaking так. Ви можете перейти за цим посиланням: tools.android.com/tech-docs/new-build-system/… . Сподіваюсь, це прояснить вас.
SkyWalker

@Jaythaking - щойно додана експериментальна підтримка невикористаних залежностей Android сьогодні з версією 4.0.0
jkschneider

4
Цей плагін, на жаль, не працює з kotlin dsl. Вони не планують її підтримувати.
Сноу

3
Він також не працює з новими Gradle конфігураціями (наприклад: implementationа api), і навіть гірше, рекомендує змінити від нових до старих застарілих одиниць (наприклад: compile, testCompileі т.д.).
Лоранс

8

Проект, згаданий у попередніх відповідях, здається, мертвий. Я використовую аналіз на залежність градусів . Установка проста:

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

apply plugin: 'ca.cutterslade.analyze'

Потім зробіть:

$ gradle analyzeDependencies

4
Я зіткнувся з цією помилкою: "Синхронізація Gradle не вдалася: Завдання з назвою" класи "не знайдено в проекті"
Pawan

Я отримую stackOverflowException, роблячи це. Немає точної інформації, що викликає це. Я думаю, що тут може виникнути проблема кругової залежності, але це було б чудовою ідеєю, я б інструмент сказав мені, де.
СГал

1
@Pawan цей плагін не працює з проектами Android, і це не зміниться найближчим часом. Доказ: github.com/wfhartford/gradle-dependency-analyze/isissue/18
diesersamat

8

Мені пощастило користуватися плагіном аналізу залежності Gradle . Щоб розпочати роботу, додайте наступні дві речі до сценарію збирання Gradle.

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

і

apply plugin: "dependencyAnalysis"

Як тільки вони на місці, біжіть gradle analyze. Якщо є невикористані залежності, ви отримаєте збій у збірці, який показує вихід, подібний до тексту нижче, а також список невикористаних залежностей (як оголошених, так і перехідних). Невдача збірки дуже зручна, якщо ви хочете встановити, що через збірку 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
Я отримую "Виконання не вдалося виконати для завдання": додаток: аналіз ".> У проекті не застосовується плагін Java." Якщо я додаю "застосувати плагін:" java ", то мені скажуть, що він не сумісний із існуючим додатком для Android. якісь ідеї?
Алекс Чорний

Схоже, це щось специфічне з додатком програми Android. Я хотів би допомогти, але в мене немає досвіду роботи з Android!
jstricker

У плагіні є помилки, як, наприклад, коли у вас є статичний виклик залежності, який не враховується.
ToYonos

Це здається застарілим для плагіну для лінійки
Руті Рут

2

Щойно я дізнався про це: https://plugins.gradle.org/plugin/com.autonomousapps.dependency-analysis

Гітуб

З вигляду він знаходиться в активному розвитку, але я ще не перевіряв його.

Редагувати: насправді це досить приголомшливо, він дає багато порад (наприклад, чи використовувати api проти реалізації)


0

Примітка редактора: Ця відповідь застаріла. Будь ласка, дивіться верхню відповідь .

Ви можете спробувати плагін com.github.nullstress.dependence-analiza Gradle

Створіть фрагмент сценарію для використання у всіх версіях Gradle:

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

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

Створіть фрагмент сценарію для нового, інкубаційного, плагінного механізму, запровадженого в Gradle 2.1:

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

Також на форумі Gradle є нитка ( чи є еквівалент Gradle "mvn залежність: аналіз"? ).


Цей плагін здається мертвим проектом ... принаймні з поточною версією Gradle.
cjstehno

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.