[Android]Gradle에서 Dependabet을 사용할 때의 Tips

이 글은 Kyash Advent Calendar 2020 9일째 되는 글이다.

Dependabet


Dependabot는 프로그램 라이브러리의 업데이트 작업을 자동화하는bot으로 GiitHub에 통합되었다.창고에 Dependabet을 설치하면 정기적으로 라이브러리 업데이트를 확인하고 향상된 버전의 Pull Request를 제작합니다.
다양한 언어에 대응해 이번에 그래드에서 디펜다봇을 활용할 때 생기는 과제와 해법을 소개한다.제목에 안드로이드라고 쓰여 있는데 그레이드 자바 프로젝트라면 같은 일을 할 수 있을 것 같다.

과제.


특히 안드로이드가 많아 라이브러리가 비대해지지 않도록 한 라이브러리를 여러 개의 위상으로 나눠 필요한 기능만 제공하는 경우도 있다.예를 들어 AndroidX Lifecycle에서 가져온 예의 코드는 다음과 같다.
    dependencies {
        def lifecycle_version = "2.2.0"
        def arch_version = "2.1.0"

        // ViewModel
        implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
        // LiveData
        implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
        // Lifecycles only (without ViewModel or LiveData)
        implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version"

        // Saved state module for ViewModel
        implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:$lifecycle_version"

        // Annotation processor
        kapt "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
        // alternately - if using Java8, use the following instead of lifecycle-compiler
        implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"

        // optional - helpers for implementing LifecycleOwner in a Service
        implementation "androidx.lifecycle:lifecycle-service:$lifecycle_version"

        // optional - ProcessLifecycleOwner provides a lifecycle for the whole application process
        implementation "androidx.lifecycle:lifecycle-process:$lifecycle_version"

        // optional - ReactiveStreams support for LiveData
        implementation "androidx.lifecycle:lifecycle-reactivestreams-ktx:$lifecycle_version"

        // optional - Test helpers for LiveData
        testImplementation "androidx.arch.core:core-testing:$arch_version"
    }
만약 이러한 공통 버전의 여러 개의 분할 위상이 있다면 버전을 변수에 잘라서 사용하는 것은 프로그래머의 당연한 방법이다.
그러나 Dependabbot에서 이렇게 버전을 변수로 잘라내면 제대로 작동하지 않습니다.Gradle의 스크립트를 실행하는 것이 아니라 문자열"androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0"을 검사하는 방법입니다.
(주) 버전 정보를 다른gradle 파일로 잘라서 순조롭게 진행되는 기사도 봤지만 제가 옆에서 시도해 봤는데 조작이 안 됐어요.이렇게 하면 돼요. 메시지가 있으면 댓글로 남겨주세요.
그렇다면 "어차피 자동으로 다시 써서 홍보를 할 수 있다면 변수는 언급하지 않아도 되겠지"라고 이렇게 쓰면 4개의 PR 업데이트를 제대로 할 수 있다.
dependencies {
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0"
    implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0"
    implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:2.2.0"
    implementation "androidx.lifecycle:lifecycle-common-java8:2.2.0"
}
하나의 PR을 통합하는 단계에서 다른 PR 충돌의 비극이 발생한다.디펜다봇은 지아이허브의 PR@dependabot rebase에도 자동 회신 기능이 있지만, 하나하나의 PR에 대한 수동 리뷰를 하면 자동화의 의미가 약해진다.

해결책


이 과제를 해결해야 한다
  • 버전을 변수로 잘라내기
  • Dependabet이 식별할 수 있는 문자열 준비
  • 필요했어
    사실 그레이드implementation 등의 방법은 Dependency형의 대상을 되돌려 버전 정보를 포함하는 것이다.따라서 다음과 같은 추출 버전의 조수 방법을 만들어 변수에 넣으면 된다.
    static String captureVersion(Dependency dependency) {
        return dependency.version
    }
    
    dependencies {
        def lifecycle_version = captureVersion(implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0"))
        implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
        implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:$lifecycle_version"
        implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
    }
    

    끝말


    이 기사는 Gradlex Dependabet을 더욱 잘 활용하기 위한 Tips를 소개했다.Android의 프로그램 라이브러리는 매우 빨리 업데이트됩니다. 이 방법을 가져온 후 Developer Experience가 많이 향상되었습니다. 꼭 시도해 보십시오.

    좋은 웹페이지 즐겨찾기