본문 바로가기

Android/Gradle

[Gradle] Gradle 7.2 버전 대응하기.

728x90

Bumblebee가 나온 이후로, 최신 버전으로 프로젝트를 생성하면 Gradle이 좀 다른 것을 볼 수 있다.

 

Project 범위의 gradle과 setting.gradle에 변경사항이 있는데, 해당 변경사항에 따라 대응하는 과정을 작성해두려고 한다.


우선,

gradle-wrapper.properties에서 gradle 버전을 확인해보면,

 

distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip

 

이처럼 7.2 이상 버전에서 적용되는 방식이다.

 

정확한 버전을 확인하기 위해서는 Developer 사이트에서 확인하길 바란다.

 

지금까지 프로젝트를 생성하면,

다음과 같은 project 범위의 gradle을 볼 수 있었을 것이다.

 

buildscript {
    repositories {
        mavenCentral()
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:4.1.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

allprojects {
    repositories {
        mavenCentral()
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

 

그리고, setting.gradle은 다음과 같이 간결했을 것이다.

 

include ':app'
rootProject.name = "ProjectName"

 

하지만 gradle 7.2로 변경하는 경우,

Developer 사이트에서 볼 수 있는 것처럼 project 범위의 gradle이 상당히 간결해진 것을 볼 수 있다.

 

plugins {
    id 'com.android.application' version '7.1.2' apply false
    id 'com.android.library' version '7.1.2' apply false
    id 'org.jetbrains.kotlin.android' version '1.5.30' apply false
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

 

그리고,

 

 

이처럼 저장소 설정 부분은 settings.gradle로 이동 되었다.

 

pluginManagement {
    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
}

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        jcenter()
    }
}

rootProject.name = "ProjectName"
include ':app'

 

이렇게 말이다.

사실 기본적인 프로젝트에서는 거의 대부분의 값들이 settings.gradle로 옮겨졌다.

 

그렇다면, 기존에 7.2 미만 버전을 사용하던 프로젝트에서 해당 gradle 버전으로 올려서 대응해보도록 하자.

필자는 기존에 생성했던 Modular Architecture Sample 프로젝트를 사용하여 변경해보았다.

 

우선,

gradle-wrapper.properties에서 gradle을 업데이트시켜주도록 한다.

 

distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip

to

distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip

 

필자가 작업했던 환경은 6.7.1 버전이었기 때문에 7.2 버전으로 올려주고 sync now를 통해 동기화를 시켜주도록 한다.

 

그 후, gradle을 확인해보면 아무런 문제도 없는 것을 알 수 있다.

즉, setting.gradle로 파일 저장소에 대한 설정을 옮기지 않고 기존대로 사용해도 상관은 없다.

 

그래도 gradle 버전을 올린 김에 맞춰서 변경하도록 한다.

 

plugins {
    ...
}

apply from : 'ext-version.gradle'

subprojects {
    ...
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

 

기존의 gradle에서 dependencies로 추가되어있던 것들을  plugins로 올리고, 버전을 맞게 업데이트해주었고,

buildscript 내부에 선언되었던 apply from : ~ 문을 밖으로 빼내어서 선언해 주었다.

 

subproject부터는 원래의 gradle과 동일하게 선언하여 두었다.

위에서도 나와있듯이 저장소에 대한 설정이 project 범위의 gradle에서 setting.gradle로 옮겨졌을 뿐이라, 위처럼 그 외의 부분은 놔두어도 상관없다.

 

 

여기서, dependencies로 추가되어있던 것들을 plugins로 올릴 때 주의해야 하는 사항이 있다.

새로운 프로젝트를 만들었을 때 자동으로 생성되는 항목을 제외하고, 자주 사용하는 gms를 사용해서 알아보도록 하자.

 

classpath 'com.google.gms:google-services:4.3.2'

 

plugins에 선언된 항목들을 확인해 보면,

id 'package' version 'version' apply false

형태로 선언되어있다.

 

id 'com.google.gms:google-services' version '4.3.2' apply false

 

그래서 단순하게 맨 뒤의 버전을 version 자리에 넣고, 그 앞의 값들을 package에 넣어서 이와 같이 사용할 수 있는데,

동기화를 진행시켜보면 다음과 같은 에러가 발생한다.

 

A problem occurred evaluating root project 'CleanArchitectureStudy'. > plugin id 'com.google.gms:google-services' is invalid: Plugin id contains invalid char ':' (only ASCII alphanumeric characters, '.', '_' and '-' characters are valid)

 

: (콜론)은 사용할 수 없고, 특수문자는 ., _, - 3가지만 사용이 가능하다고 한다.

 

그렇다면 뒤의 :google-services를 제거하고 'com.google.gms'로 사용해야 하는가 싶은데, 그것 또한 맞지 않고,

단순하게 :을 사용되는 부분을 . 으로 변경하면 된다.

 

id 'com.google.gms.google-services' version '4.3.2' apply false

 

이처럼 말이다.

 

즉, 기존에 classPath로 dependecies로 사용하던 항목을 plugins으로 변경할 때,

기존의 사용 방법을 그대로 사용하는 것이 아니라, 제대로 찾아보고 변경을 진행해야 한다는 것이다.

 

google services 페이지를 확인해 보면,

 

 

이처럼 plugin에 사용할 때의 방식이 나와있으니 제대로 확인하고 작업을 진행해야 한다.

 

settings.gradle은 위에 작성된 것과 마찬가지로 project 범위의 gradle에서 제거한 저장소 관련된 항목들을 옮겨주면 된다.

 

pluginManagement {
    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
}

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}

rootProject.name = "CleanArchitectureStudy"
include ':presentation'
include ':data'
include ':domain'
include ':moviesearch'
include ':core'
include ':move'

 

하단에는 Modular Architecture에서 사용하는 모듈들이 include 되어있고,

그 외의 항목들은 default로 생성되었을 때의 설정 값과 동일하며, jcenter() 항목만 제거된 것을 확인할 수 있다.

기존 사용하던 gradle 버전에서는 jcenter()에 Lint 표시가 되어있었으며, 주석으로 곧 해당 레파지토리는 제거될 것이다.라고 나와있었는데 이번에 버전이 올라가면서 해당 부분이 제거가 되었다.

 

이것을 제거함으로써 koin에서 변경되는 부분이 따로 존재하는데, 이것은 다음 글로 작성하도록 하겠다.

필자가 적용했던 해당 프로젝트에서는 koin을 제외하고 다른 부분에서 문제가 발생하지는 않았는데,

다양한 라이브러리를 사용하고 있는 프로젝트라면 해당 부분을 제거했을 때 문제가 생길 수 있는 라이브러리가 있을 것이니 찾아서 변경을 진행해 주어야 한다.


장황하게 설명을 작성했지만, 간단하게 정리하자면

 

gradle 버전 7.2 이상부터는

  1. Project 범위의 gradle에 선언되어 있던 repository에 대한 설정이 settings.gradle로 옮겨졌기 때문에, repository에 대한 설정을 settings.gradle로 옮겨주면 된다.
  2. 기존 dependencies에 선언되어있던 classpath 항목들은 plugins 항목으로 교체해야 하며, 각 항목들을 확인해보면 plugins에 선언할 때의 방법도 나와있으니, 그대로 사용하지 말고 공식 페이지를 확인해보고 적용해야 한다.
  3. repository에서 기존에 제거가 예정되었던 jcenter()가 이번 버전부터 제거되었으므로, jcenter()를 사용하는 library를 사용하고 있다면 이에 따른 대응을 따로 해주어야 한다.
  4. 그 외의 것들과, app 범위의 Module 등의 사용 방법은 이전과 동일하다.

라는 것이다.

 

해당 프로젝트에서는 실제로 변경된 부분이 많지는 않지만, 실 프로젝트에서 gradle 버전을 올리게 된다면 많은 부분을 신경 써줘야 할 것 같다.

jcenter()가 제거됨에 따라서, 해당 부분을 사용하는 라이브러리가 많다면 더욱 복잡해질 것이다. 당장 해당 프로젝트에서도 jcenter()가 제거되니 koin에서 오류가 발생했으니 말이다.

 

따라서, 다음 게시글에서는 gradle 7.2 버전 이상으로 업데이트할 때, koin에서의 변경되는 부분을 작성해보고자 한다.

 

해당 게시글에 사용한 예제는 Github에 올려두었다.

https://github.com/HeeGyeong/ModuleArchitecture

 

GitHub - HeeGyeong/ModuleArchitecture

Contribute to HeeGyeong/ModuleArchitecture development by creating an account on GitHub.

github.com

 

728x90