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 |