Gradle Plugin 적용하기

taetae98·2023년 8월 26일

Gradle Plugin 필요성

Android에서 Hilt를 적용한다면 아래 Gradle 코드가 필요합니다. 만약 멀티 모듈로 프로젝트를 관리한다면 Hilt를 사용하는 모듈에 중복 코드가 생기게 됩니다. 🥲

dependencies {
  implementation 'com.google.dagger:hilt-android:2.47'
  kapt 'com.google.dagger:hilt-compiler:2.47'

  // For instrumentation tests
  androidTestImplementation  'com.google.dagger:hilt-android-testing:2.47'
  kaptAndroidTest 'com.google.dagger:hilt-compiler:2.47'

  // For local unit tests
  testImplementation 'com.google.dagger:hilt-android-testing:2.47'
  kaptTest 'com.google.dagger:hilt-compiler:2.47'
}

kapt {
 correctErrorTypes true
}

Gradle Plugin

A Gradle plugin packages up reusable pieces of build logic, which can be used across many different projects and builds. Gradle allows you to implement your own plugins, so you can reuse your build logic, and share it with others.

Plugin이란 빌드에 관련된 로직(task, dependency...) 등을 모아서 재사용할 수 있게 도와주는 역할을 합니다.

  • org.jetbrains.kotlin.android, com.android.application 등 안드로이드에서 사용하는 Plugin이며 내부적으로 Android 빌드에 필요한 코드로 구성되어 있습니다.

buildScript 형식으로 프로젝트 내부에서 사용할 수 있으며, 독립 형태로 만들어서 배포하여 프로젝트 외부에서도 사용할 수 있습니다.

Gradle Plugin 구현

1. 프로젝트 단위 settings.gradle.kts에 Gradle Plugin 프로젝트를 추가합니다.

pluginManagement {
    repositories {
        includeBuild("build-logic")
    }
}

2. 루트 프로젝트에 Gradle Plugin 프로젝트를 만들고 build.gradle.kts, settings.gradle.kts를 생성합니다.

프로젝트 구조

Project
- build-logic
  - build.gradle.kts
  - settings.gradle.kts

build.gradle.kts

  • Plugin 구현에 필요한 의존성을 추가할 수 있습니다.
    • Hilt를 구현한다면 com.google.dagger:hilt-android-gradle-plugin 같이 필요한 의존성을 추가합니다.
    • VersionCatalog를 사용할 수 있습니다.
plugins {
    `kotlin-dsl`
}

java {
    sourceCompatibility = JavaVersion.VERSION_17
    targetCompatibility = JavaVersion.VERSION_17
}

dependencies {

}

settings.gradle.kts

  • VersionCatalog를 추가하여 사용할 수 있습니다.
dependencyResolutionManagement {
    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }

    versionCatalogs {
        create("libs") {
            from(files("../gradle/libs.versions.toml"))
        }
    }
}

3. Plugin 구현

  • Plugin 인터페이스를 상속받고 공통된 로직을 구현합니다.
internal class HiltPlugin : Plugin<Project> {
    override fun apply(target: Project) {
        applyPlugin(target.pluginManager)
        applyDependency(target.dependencies, target.getVersionCatalog())
        applyKapt(target.extensions.getByType())
    }

    private fun applyPlugin(manager: PluginManager) = with(manager) {
        apply("com.google.dagger.hilt.android")
        apply("org.jetbrains.kotlin.kapt")
    }

    private fun applyDependency(handler: DependencyHandler, libs: VersionCatalog) = with(handler) {
        implementation(libs.findLibrary("hilt-android").get())
        kapt(libs.findLibrary("hilt-compiler").get())
    }

    private fun applyKapt(extension: KaptExtension) = with(extension) {
        correctErrorTypes = true
    }
}

Gradle Plugin 적용

1. 프로젝트에 Plugin 등록

build-logic 프로젝트 build.gradle.kts

  • gradlePlugin > plugins 에 Plugin을 등록합니다.
    • implementationClass는 패키지까지 같이 등록합니다. ex) com.example.helloworld.HiltPlugin
gradlePlugin {
    plugins {
        register("플러그인_이름") {
            id = "플로그인_아이디"
            implementationClass = "플러그인_패키지"
        }
    }
}

2. 모듈에 Plugin 적용

모듈 build.gradle.kts

plugins {
    id("플러그인_아이디")
}

참고

profile
네이버 웹툰 안드로이드 개발자

0개의 댓글