buildSrc를 적용한 Gradle의 Dependency Update하기

이번 포스팅에서는 buildSrc가 적용된 Gradle에서 디펜던시 버전을 체크하는 방법에 대해 알아보도록 하겠습니다.

안드로이드 스튜디오는 프로젝트의 디펜던시에 대해 다음 린트를 실행시키기 때문에 새 버전이 있을 경우 자동으로 알림을 받을 수 있지만, dependency 추가에 buildSrc를 적용하면 이 린트 기능을 활용할 수 없게 됩니다.

1
Editor > Inspections > Android > Lint > Correctness > Newer Library Versions Available

이런 문제를 해결하기 위해서 여기서는 IDE의 기능에 관계없이 디펜던시 버전을 체크해주는 Gradle Versions Plugin을 사용하는 방법에 대해 알아보도록 하겠습니다.

여기서는 저의 Modern Android Development 인프런 강의에서 만들어 본 BookSearchApp에 기능을 적용해 보도록 하겠습니다. 우선은 프로젝트 레벨의 build.gradle에 플러그인을 추가합니다.

1
2
3
plugins {
  id("com.github.ben-manes.versions") version "0.43.0"
}

다음은 네트워크에서 아티팩트 정보를 받아온 뒤 안정버전인지 여부를 판정하는 함수를 추가합니다.

1
2
3
4
5
6
fun isNonStable(version: String): Boolean {
    val stableKeyword = listOf("RELEASE", "FINAL", "GA").any { version.toUpperCase().contains(it) }
    val regex = "^[0-9,.v-]+(-r)?$".toRegex()
    val isStable = stableKeyword || regex.matches(version)
    return isStable.not()
}

다음은 디펜던시 버전을 체크하는 태스크를 정의합니다. 제한사항을 rejectVersionIf로 간편하게 정의할 수도 있고 full syntax를 써서 정의할 수도 있습니다. 또한 옵션을 정의할 수도 있는데요, 각 프로퍼티의 기능은 이름을 보면 잘 알 수 있게 되어 있습니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import com.github.benmanes.gradle.versions.updates.DependencyUpdatesTask

tasks.named<DependencyUpdatesTask>("dependencyUpdates")
    .configure {
        // isStable에 해당되지 않는 모든 버전을 거부
        rejectVersionIf {
            isNonStable(candidate.version)
        }

        // optional parameters
        checkForGradleUpdate = true
        outputFormatter = "json"
        outputDir = "build/dependencyUpdates"
        reportfileName = "report"
    }
}

그리고나서 dependencyUpdate를 실행시키면 콘솔 화면에 체크 결과가 출력되고, 옵션에 설정된 json 파일도 생성되는 것을 확인할 수 있습니다.

1
./gradlew dependencyUpdate

인프런 강의에서 만들어 본 BookSearchApp의 디펜던시를 체크한 결과는 다음과 같습니다. 프로젝트가 마무리 된 2022년 4월 이후로 많은 업데이트가 있었던 것을 확인할 수 있네요. 나머지는 업데이트가 필요한 디펜던시를 찾아 버전을 올리면 됩니다.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
------------------------------------------------------------
: Project Dependency Updates (report to plain text file)
------------------------------------------------------------

The following dependencies are using the latest milestone version:
 - androidx.datastore:datastore-preferences:1.0.0
 - androidx.hilt:hilt-compiler:1.0.0
 - androidx.hilt:hilt-work:1.0.0
 - androidx.paging:paging-runtime-ktx:3.1.1
 - androidx.recyclerview:recyclerview:1.2.1
 - androidx.test:core:1.4.0
 - androidx.test:runner:1.4.0
 - androidx.test.espresso:espresso-contrib:3.4.0
 - androidx.test.espresso:espresso-core:3.4.0
 - androidx.test.ext:junit:1.1.3
 - androidx.test.ext:truth:1.4.0
 - androidx.work:work-runtime-ktx:2.7.1
 - com.google.android.libraries.mapsplatform.secrets-gradle-plugin:com.google.android.libraries.mapsplatform.secrets-gradle-plugin.gradle.plugin:2.0.1
 - com.squareup.retrofit2:converter-moshi:2.9.0
 - com.squareup.retrofit2:retrofit:2.9.0
 - junit:junit:4.13.2
 - org.hamcrest:hamcrest:2.2

The following dependencies have later milestone versions:
 - androidx.activity:activity-ktx [1.4.0 -> 1.6.1]
     https://developer.android.com/jetpack/androidx/releases/activity#1.6.1
 - androidx.appcompat:appcompat [1.4.1 -> 1.5.1]
     https://developer.android.com/jetpack/androidx/releases/appcompat#1.5.1
 - androidx.constraintlayout:constraintlayout [2.1.3 -> 2.1.4]
     http://tools.android.com
 - androidx.core:core-ktx [1.7.0 -> 1.9.0]
     https://developer.android.com/jetpack/androidx/releases/core#1.9.0
 - androidx.databinding:viewbinding [7.1.3 -> 7.3.1]
 - androidx.fragment:fragment-ktx [1.4.1 -> 1.5.4]
     https://developer.android.com/jetpack/androidx/releases/fragment#1.5.4
 - androidx.lifecycle:lifecycle-runtime-ktx [2.4.1 -> 2.5.1]
     https://developer.android.com/jetpack/androidx/releases/lifecycle#2.5.1
 - androidx.lifecycle:lifecycle-viewmodel-ktx [2.4.1 -> 2.5.1]
     https://developer.android.com/jetpack/androidx/releases/lifecycle#2.5.1
 - androidx.lifecycle:lifecycle-viewmodel-savedstate [2.4.1 -> 2.5.1]
     https://developer.android.com/jetpack/androidx/releases/lifecycle#2.5.1
 - androidx.navigation:navigation-fragment-ktx [2.4.1 -> 2.5.3]
     https://developer.android.com/jetpack/androidx/releases/navigation#2.5.3
 - androidx.navigation:navigation-ui-ktx [2.4.1 -> 2.5.3]
     https://developer.android.com/jetpack/androidx/releases/navigation#2.5.3
 - androidx.navigation.safeargs.kotlin:androidx.navigation.safeargs.kotlin.gradle.plugin [2.4.1 -> 2.5.3]
     https://developer.android.com/jetpack/androidx/releases/navigation#2.5.3
 - androidx.room:room-compiler [2.4.2 -> 2.4.3]
     https://developer.android.com/jetpack/androidx/releases/room#2.4.3
 - androidx.room:room-ktx [2.4.2 -> 2.4.3]
     https://developer.android.com/jetpack/androidx/releases/room#2.4.3
 - androidx.room:room-paging [2.4.2 -> 2.4.3]
     https://developer.android.com/jetpack/androidx/releases/room#2.4.3
 - androidx.room:room-runtime [2.4.2 -> 2.4.3]
     https://developer.android.com/jetpack/androidx/releases/room#2.4.3
 - com.android.application:com.android.application.gradle.plugin [7.1.3 -> 7.3.1]
     https://developer.android.com/studio/build
 - com.android.library:com.android.library.gradle.plugin [7.1.3 -> 7.3.1]
     https://developer.android.com/studio/build
 - com.google.android.material:material [1.5.0 -> 1.7.0]
     https://github.com/material-components/material-components-android
 - com.google.dagger:hilt-android [2.41 -> 2.44]
     https://github.com/google/dagger
 - com.google.dagger:hilt-android-compiler [2.41 -> 2.44]
     https://github.com/google/dagger
 - com.google.dagger:hilt-android-testing [2.41 -> 2.44]
     https://github.com/google/dagger
 - com.google.dagger:hilt-compiler [2.41 -> 2.44]
     https://github.com/google/dagger
 - com.google.dagger.hilt.android:com.google.dagger.hilt.android.gradle.plugin [2.41 -> 2.44]
     https://github.com/google/dagger
 - com.squareup.moshi:moshi [1.13.0 -> 1.14.0]
     https://github.com/square/moshi/
 - com.squareup.moshi:moshi-kotlin-codegen [1.13.0 -> 1.14.0]
     https://github.com/square/moshi/
 - com.squareup.okhttp3:logging-interceptor [4.9.3 -> 4.10.0]
     https://square.github.io/okhttp/
 - com.squareup.okhttp3:okhttp [4.9.3 -> 4.10.0]
     https://square.github.io/okhttp/
 - io.coil-kt:coil [1.4.0 -> 2.2.2]
     https://github.com/coil-kt/coil
 - org.jacoco:org.jacoco.ant [0.8.3 -> 0.8.8]
     http://jacoco.org
 - org.jetbrains.kotlin:kotlin-annotation-processing-gradle [1.6.10 -> 1.7.20]
     https://kotlinlang.org/
 - org.jetbrains.kotlin:kotlin-parcelize-compiler [1.6.10 -> 1.7.20]
     https://kotlinlang.org/
 - org.jetbrains.kotlin:kotlin-parcelize-runtime [1.6.10 -> 1.7.20]
     https://kotlinlang.org/
 - org.jetbrains.kotlin:kotlin-stdlib [1.6.10 -> 1.7.20]
     https://kotlinlang.org/
 - org.jetbrains.kotlin.plugin.serialization:org.jetbrains.kotlin.plugin.serialization.gradle.plugin [1.6.10 -> 1.7.20]
     https://kotlinlang.org/
 - org.jetbrains.kotlinx:kotlinx-coroutines-android [1.6.0 -> 1.6.4]
     https://github.com/Kotlin/kotlinx.coroutines
 - org.jetbrains.kotlinx:kotlinx-coroutines-core [1.6.0 -> 1.6.4]
     https://github.com/Kotlin/kotlinx.coroutines
 - org.jetbrains.kotlinx:kotlinx-coroutines-test [1.6.2 -> 1.6.4]
     https://github.com/Kotlin/kotlinx.coroutines
 - org.jetbrains.kotlinx:kotlinx-serialization-json [1.3.2 -> 1.4.1]
     https://github.com/Kotlin/kotlinx.serialization
 - org.robolectric:robolectric [4.8.1 -> 4.9]
     http://robolectric.org

Failed to determine the latest version for the following dependencies (use --info for details):
 - com.github.ben-manes.versions:com.github.ben-manes.versions.gradle.plugin
 - org.jetbrains.kotlin.android:org.jetbrains.kotlin.android.gradle.plugin

Gradle release-candidate updates:
 - Gradle: [7.2 -> 7.5.1 -> 7.6-rc-1]

Generated report file build/dependencyUpdates/report.json

이렇게 해서 Gradle에서 사용된 디펜던시의 버전을 체크하는 법에 대해 알아보았습니다.

Built with Hugo
Theme Stack designed by Jimmy