Gradle에서 사용하지 않는 종속성을 찾고 제거하는 방법


답변:


72

업데이트 : 28-06-2016 : 사용되지 않는 종속성에 대한 Android 지원

20176 월 에는을 릴리스 4.0.0 version 하고 루트 프로젝트 이름 "gradle-lint-plugin""nebula-lint-plugin". 또한 unused-dependencyAndroid 지원을 추가했습니다 .


20165 월 Gradle은 원치 않는 종속성을 찾고 제거하기 위해 Gradle lint 플러그인 을 구현했습니다.

Gradle Lint 플러그인 : 전체 문서

Gradle Lint 플러그인은 Gradle 스크립트 및 관련 파일의 오용 또는 지원 중단 패턴을 식별하고보고하기위한 플러그 가능하고 구성 가능한 linter 도구입니다.

이 플러그인에는 다양한 규칙이 있습니다. 사용하지 않는 종속성 규칙 은 그중 하나입니다. 세 가지 특성이 있습니다.

  1. 사용하지 않는 종속성을 제거합니다.
  2. 코드에서 직접 사용하는 전이 종속성을 명시적인 1 차 종속성으로 승격합니다.
  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

엔터프라이즈 빌드의 경우 init.gradle 스크립트 또는 Gradle 적용 메커니즘을 통해 포함 된 Gradle 스크립트에서 Lint 규칙을 정의하는 것이 좋습니다.

다중 모듈 프로젝트의 경우 플러그인을 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와 같은 패밀리 스타일 jar는 코드가 포함되어 있지 않으므로 제거됩니다.

2. 코드에서 직접 사용하는 전이 종속성을 명시적인 1 차 종속성으로 승격합니다.

  • com.amazonaws : aws-java-sdk와 같은 패밀리 스타일 JAR 파일을 실제로 사용중인 부분으로 분리하고이를 1 차 종속성으로 추가하는 부작용이 있습니다.

3. 종속성을 '올바른'구성으로 재배치합니다.

  • Webjar가 런타임 구성으로 이동 됨
  • META-INF 외부의 클래스 콘텐츠를 포함하지 않는 JAR 파일은 런타임으로 이동됩니다.
  • 'xerces', 'xercesImpl', 'xml-apis'는 항상 런타임 범위 여야합니다.
  • mysql-connector-java와 같은 서비스 공급자 (META-INF / 서비스가 포함 된 JAR 파일)는 입증 가능한 컴파일 시간 참조가없는 경우 런타임으로 이동됩니다.
  • 종속성은 가능한 가장 높은 소스 세트 구성으로 이동됩니다. 예를 들어, 'junit'는 기본 소스 세트 (드물게)에 명시적인 종속성이없는 한 testCompile로 재배치됩니다.


업데이트 : 이전 플러그인

귀하의 친절한 정보를 위해 이전 플러그인에 대해 공유하고 싶습니다

  1. 사용되지 않는 종속성, 선언 및 전이를 찾는 Gradle 플러그인은 com.github.nullstress.dependency-analysis입니다.

그러나 최신 버전 1.0.3은 2014 년 12 월 23 일에 생성되었습니다 . 그 후에는 업데이트가 없습니다.

주의 : 많은 엔지니어들이 버전 번호 만 업데이트했기 때문에이 플러그인 에 대해 혼란스러워하고 있습니다.


gradle-lint-plugin은 Android와 호환됩니까?
Jaythaking

@Jaythaking 네. 이 링크를 통해 이동할 수 있습니다 : tools.android.com/tech-docs/new-build-system/… . 그것이 당신을 명확히하기를 바랍니다.
SkyWalker

@Jaythaking - 안드로이드되지 않는 종속성 방금 추가 실험 지원을 현재 버전 4.0.0로
jkschneider

4
이 플러그인은 슬프게도 kotlin dsl에서 작동하지 않습니다. 그들은 그것을 지원할 계획이 없습니다.

3
또한 새로운 Gradle을 구성하여 작업을하지 않습니다 (예 : implementationapi), 심지어 악화, 이전되지 않는 것들에 새로운에서 변경할 것을 권장합니다 (예 : compile, testCompile, 등).
Laurence Gonsalves 19

8

이전 답변에서 언급 한 프로젝트는 죽은 것 같습니다. 나는 gradle-dependency-analyze를 사용 합니다. 설정은 간단합니다.

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을 얻습니다. 이 문제를 일으키는 정확한 정보는 없습니다. 여기에 순환 종속성 문제가있을 수 있다고 생각하지만 도구가 어디에 있는지 알려주는 것이 좋습니다.
SGal

1
@Pawan이 플러그인은 Android 프로젝트에서 작동하지 않으며 조만간 변경되지 않습니다. 증명 : github.com/wfhartford/gradle-dependency-analyze/issues/18
diesersamat

8

Gradle Dependency Analysis Plugin을 사용하여 많은 행운을 얻었습니다 . 시작하려면 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
" ': app : analyze'작업에 대한 실행이 실패했습니다.> 프로젝트에 Java 플러그인이 적용되지 않았습니다."라는 메시지가 표시됩니다. "apply plugin : 'java'"를 추가하면 기존 Android 애플리케이션 플러그인과 호환되지 않는다는 메시지가 표시됩니다. 어떤 아이디어?
Alex Black

Android 애플리케이션 플러그인에 특정한 것 같습니다. 도와 드릴 수 있으면 좋겠지 만 Android 사용 경험이 없습니다!
jstricker

플러그인에는 예를 들어 고려되지 않은 종속성에 대한 정적 호출이있는 경우와 같은 버그가 있습니다.
ToYonos

이것은 린터의 플러그인되지 않는 것 같다
Ruthi 루스에게


0

편집자 주 :이 답변은 오래되었습니다. 상위 답변을 참조하십시오 .

com.github.nullstress.dependency-analysis 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 포럼에 이에 대한 스레드 ( "mvn dependency : analyze" 에 해당하는 Gradle이 있습니까? )가 있습니다.


이 플러그인은 적어도 현재 Gradle 버전에서는 죽은 프로젝트 인 것 같습니다.
cjstehno

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.