1. Plugins이란

Plugins은 task들의 집합이다. 라고하면 어느 정도 맞는 말이긴 하지만 그렇게 단순하지 않다.

 

Gradle 공식 Documentation을 참고했을 때,

Plugin에 대해서 첫 문단으로 아래와 같이 소개하고 있다.

Gradle is built on a plugin system. Gradle itself is primarily composed of infrastructure, such as a sophisticated dependency resolution engine. The rest of its functionality comes from plugins.

 

이는 Gradle 자체는 주로 의존성 해결, 작업 실행 엔진 등과 같은 Infrastructure로 구성되어 있으며, 이러한 기능들로 빌드를 수행할 수 있다. 하지만 실제 기능은 Plugin으로 제공된다

 

Plugin에는 사용자가 정의한 Task, 환경설정, 작업순서 등이 포함되어 있는 재사용 가능한 빌드 프로세스이다.

 

 

2. Plugins 분류

Plugin 종류는 Core, Community, Local or Custom 이렇게 세 가지가 존재하고

Custom은 Script, Precompiled Script, Binary 세 가지 방식이 있다.

 

Script 방식은 plugins를 gradle.kts파일에 작성하여 사용하는 방식이고(빌드 시 실행함)

 

Precompiled Script방식은 정의된 Plugins를 gradle.kts파일(빌드 시 Jar로 저장)에 DSL등의 방식으로 불러와 사용한다.

 

Binary 방식 또한 Jar파일로 생성하여 사용하지만, Precompiled script는 프로젝트에 한정되는 반면 Binary는 Maven 저장소 등에 저장하여 여러 프로젝트에 재사용할 수 있도록 한다.

 

즉, Precompiled와 Binary의 방식은 둘 다 Jar파일로 선 컴파일 후 사용하는 방식으로 같으며, 프로젝트 내부에 사용하는 목적으로 배포를 하는지 안 하는지에 따른 차이가 존재한다. 또한, Precompiled는 빌드마다 Jar파일을 생성하는 과정을 거치고 Binary는 외부 프로젝트로 생성된 Jar파일을 사용하므로 빌드 효율이 Binary방식이 더 뛰어나다

 

최근 Android 예제 앱(NIA 등)에서 Build-logic을 구현할 때 사용하는 방식은 Convention Plugins로 일종의 Binary 방식이다.

 

3. Convention Plugins

Convention Plugins는 Core, Community Plugin을 설정, Dependency를 받아오고 이를 나만의 Convention으로 묶어 재사용하는 방식이다.

 

예를 들어 멀티모듈로 앱을 제작하고 있는데

- App Module

- Data Module

- Domain Module을 사용하고 있다고 했을 때,

 

각 모듈은 gradle.kts를 가지고 있고, 자바 버전을 변경하기 위해서는 3개의 gradle.kts에 접근하여 자바 버전을 수정해줘야 하는 번거로움이 있다.

 

이처럼 동일한 작업을 여러 번 반복하지 않고 버전컨트롤의 편의를 위해서 각 모듈에 공통적으로 필요한 Plugins를 myPlugins로 정의하고 이를 세 모듈에 적용하는 방식의 Convention을 작성하는 것이다.

 

공식 홈페이지의 예제를 가져와서 설명하자면

 

Convention을 작성할 때, 아래와 같은 내용을 my-plugins.gradle.kts파일에 작성하면 자동적으로 my-plugins로 id가 할당되어 타 모듈에 적용 시 직접 파일의 이름을 ID로 사용하면 된다. 아래는 Precompiled script 방식의 예이다.

 

buildSrc/src/main/kotlin/my-java-library.gradle.kts
plugins {
    id("java-library")
    id("org.jetbrains.kotlin.jvm")
}

repositories {
    mavenCentral()
}

java {
    toolchain.languageVersion.set(JavaLanguageVersion.of(11))
}

tasks.test {
    useJUnitPlatform()
}

kotlin {
    jvmToolchain(11)
}

 

 

 

4. Binary Plugins

 

만약 Binary방식으로 사용하고자 한다면, 다음과 같이 설정한 Plugin을 생성해주는 과정이 필요하다. 

gradlePlugin {
    plugins {
        create("simplePlugin") { // 즉시 생성
            id = "org.example.greeting"
            implementationClass = "org.example.GreetingPlugin"
        }
        
        register("simplePlugin") {// 지연 생성
            id = "org.example.greeting"
            implementationClass = "org.example.GreetingPlugin"
        }
    }
}

 

다음으로 Binary Plugins를 Android Example을 위주로 알아보겠다.

'gradle' 카테고리의 다른 글

4. Plugin Extension이해하기(AGP)  (1) 2024.08.30
2. Gradle의 TASK 이해하기  (0) 2024.08.16
1. Gradle이 무엇이고, 왜 쓰는가?  (0) 2024.08.16
3. Android Gradle Plugin Extend해보기  (0) 2022.10.23
2. Gradle의 Plugin  (0) 2022.10.21
리워크