Jak znaleźć / usunąć nieużywane zależności w Gradle


Odpowiedzi:


72

AKTUALIZACJA: 28-06-2016: Wsparcie Androida dla nieużywanej zależności

W czerwcu 2017 wydali 4.0.0 version i zmienili nazwę głównego projektu "gradle-lint-plugin"na "nebula-lint-plugin". Dodali również obsługę Androida do nieużywanej zależności .


W maju 2016 Gradle zaimplementował wtyczkę Gradle lint do znajdowania i usuwania niechcianych zależności

Wtyczka Gradle Lint: Pełna dokumentacja

Wtyczka Gradle Lint to podłączane i konfigurowalne narzędzie linter do identyfikowania i zgłaszania wzorców niewłaściwego użycia lub przestarzałych skryptów Gradle i powiązanych plików.

Ta wtyczka ma różne zasady. Nieużywana reguła zależności jest jedną z nich. Ma trzy szczególne cechy.

  1. Usuwa nieużywane zależności.
  2. Promuje zależności przechodnie, które są używane bezpośrednio przez kod, aby jawnie określić zależności pierwszego rzędu.
  3. Przenosi zależności do „prawidłowej” konfiguracji.

Aby zastosować regułę, dodaj:

gradleLint.rules += 'unused-dependency'

Szczegóły dotyczące nieużywanej reguły zależności podano w ostatniej części.

Aby zastosować wtyczkę Gradle lint:

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

Alternatywnie:

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

apply plugin: 'nebula.lint'

Zdefiniuj, które reguły chcesz usunąć:

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

W przypadku kompilacji dla przedsiębiorstw zalecamy zdefiniowanie reguł lint w skrypcie init.gradle lub w skrypcie Gradle, który jest dołączony za pośrednictwem mechanizmu Gradle Apply from.

W przypadku projektów wielomodułowych zalecamy stosowanie wtyczki w allprojectsbloku:

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


Szczegóły dotyczące nieużywanej reguły zależności są podane w tej części

Aby zastosować regułę, dodaj:

gradleLint.rules += 'unused-dependency'

Reguła sprawdza skompilowane pliki binarne emanujące z zestawów źródłowych projektu w poszukiwaniu odwołań do klas i dopasowuje te odwołania do zależności zadeklarowanych w bloku zależności .

W szczególności reguła wprowadza następujące zmiany w zależnościach:

1. Usuwa nieużywane zależności

  • Jary w stylu rodzinnym, takie jak com.amazonaws: aws-java-sdk są usuwane, ponieważ nie zawierają żadnego kodu

2. Promuje zależności przechodnie, które są używane bezpośrednio w kodzie, do jawnych zależności pierwszego rzędu

  • Ma to efekt uboczny dzielenia plików JAR w stylu rodzinnym, takich jak com.amazonaws: aws-java-sdk, na części, których faktycznie używasz, i dodawania ich jako zależności pierwszego rzędu

3. Przenosi zależności do „prawidłowej” konfiguracji

  • Pliki WebJars są przenoszone do konfiguracji środowiska wykonawczego
  • Pliki JAR, które nie zawierają żadnych klas i treści poza META-INF, są przenoszone do środowiska wykonawczego
  • „xerces”, „xercesImpl”, „xml-apis” powinny być zawsze objęte zakresem czasu wykonywania
  • Dostawcy usług (pliki JAR zawierające META-INF / usługi), tacy jak mysql-connector-java, są przenoszeni do środowiska wykonawczego, jeśli nie ma żadnego możliwego do udowodnienia odniesienia do czasu kompilacji
  • Zależności są przenoszone do najwyższej możliwej konfiguracji zestawu źródeł. Na przykład „junit” jest przenoszony do testCompile, chyba że istnieje wyraźna zależność od niego w głównym zestawie źródeł (rzadko).


UPDATE: Poprzednie wtyczki

Dla waszej miłej informacji, chcę podzielić się informacjami o poprzednich wtyczkach

  1. Wtyczka Gradle, która znajduje nieużywane zależności, zadeklarowane i przechodnie, to com.github.nullstress.dependency-analysis

Ale jego najnowsza wersja 1.0.3 jest tworzona 23 grudnia 2014 . Po tym nie ma żadnych aktualizacji.

Uwaga: wielu naszych inżynierów jest zdezorientowanych co do tej wtyczki, ponieważ zaktualizowali tylko numer wersji, nic więcej.


Czy wtyczka gradle-lint-plugin jest kompatybilna z systemem Android?
Jaythaking,

@Jaythaking yes. Możesz przejść przez ten link: tools.android.com/tech-docs/new-build-system/… . Mam nadzieję, że to cię wyjaśni.
SkyWalker

@Jaythaking - właśnie dodałem eksperymentalną obsługę nieużywanych zależności Androida dzisiaj w wersji 4.0.0
jkschneider

4
Ta wtyczka niestety nie działa z kotlin dsl. Nie planują go wspierać.
śnieżne

3
Nie działa również z nowymi konfiguracjami gradle (np .: implementationiapi ), a nawet gorzej, zaleca zmianę z nowymi do starych nieaktualnych (np compile, testCompileitp).
Laurence Gonsalves,

8

Projekt wspomniany we wcześniejszych odpowiedziach wydaje się martwy. Używam analizy zależności-gradle . Konfiguracja jest prosta:

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

apply plugin: 'ca.cutterslade.analyze'

Następnie wykonaj:

$ gradle analyzeDependencies

4
Mam do czynienia z tym błędem: „Synchronizacja Gradle nie powiodła się: zadanie o nazwie„ klasy ”nie zostało znalezione w projekcie”
Pawan

Otrzymuję stackOverflowException, który to robi. Brak dokładnych informacji, co jest tego przyczyną. Myślę, że w tym miejscu może występować problem z zależnością cykliczną, ale byłoby świetnym pomysłem, gdybym narzędzie powiedział mi, gdzie.
SGal

1
@Pawan ta wtyczka nie działa z projektami na Androida i to się nie zmieni w najbliższym czasie. Dowód: github.com/wfhartford/gradle-dependency-analyze/issues/18
diesersamat

8

Miałem dużo szczęścia, używając wtyczki Gradle Dependency Analysis . Aby rozpocząć, dodaj następujące dwie rzeczy do skryptu kompilacji Gradle.

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

i

apply plugin: "dependencyAnalysis"

Gdy już są na miejscu, biegnij gradle analyze. Jeśli istnieją nieużywane zależności, otrzymasz błąd kompilacji, który pokazuje dane wyjściowe podobne do poniższego tekstu, a także listę nieużywanych zależności (zarówno zadeklarowanych, jak i przechodnich). Niepowodzenie kompilacji jest naprawdę przydatne, jeśli chcesz wymusić, że nie powinno być nieużywanych zależności za pośrednictwem kompilacji 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
Otrzymuję komunikat „Wykonanie nie powiodło się dla zadania ': aplikacja: analiza'.> Projekt nie ma zastosowanej wtyczki java.” Jeśli dodam „zastosuj wtyczkę: 'java'”, otrzymam informację, że nie jest ona zgodna z istniejącą wtyczką aplikacji na Androida. jakieś pomysły?
Alex Black,

Wygląda na to, że jest to coś specyficznego z wtyczką aplikacji na Androida. Chciałbym móc pomóc, ale nie mam doświadczenia z Androidem!
jstricker

Wtyczka ma błędy, na przykład gdy masz statyczne wywołanie zależności, które nie są brane pod uwagę.
ToYonos

to wydaje się być przestarzałe dla wtyczki linter
Ruthi Ruth


0

Uwaga redaktora: ta odpowiedź jest nieaktualna. Zobacz najlepszą odpowiedź .

Możesz wypróbować analizę com.github.nullstress.dependency-analysis Gradle

Utwórz fragment skryptu do użytku we wszystkich wersjach Gradle:

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

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

Zbuduj fragment skryptu dla nowego mechanizmu inkubacji wtyczek wprowadzonego w Gradle 2.1:

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

Na forum Gradle istnieje również wątek ( Czy istnieje odpowiednik „zależności mvn: analiza”? ) Na ten temat.


Ta wtyczka wydaje się być martwym projektem ... przynajmniej w obecnej wersji Gradle.
cjstehno

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.