1. 바이너리 플러그인 개요
- 바이너리 플러그인은 JAR 파일로 컴파일되어 배포되는 Gradle 플러그인입니다.
- 일반적으로 Java나 Kotlin으로 작성되며, 다음과 같은 특징을 가집니다:
- 재사용 가능한 빌드 로직을 포함
- 프로젝트 간 공유 가능
- 메이븐 저장소를 통한 배포 가능
- IDE 지원을 통한 개발 용이성
2. Plugin Development 플러그인 사용하기
2.1 기본 설정
- Plugin Development 플러그인(
java-gradle-plugin
)은 Gradle 플러그인 개발을 돕는 도구입니다. - 다음과 같은 기능을 제공합니다:
- Java 플러그인 자동 적용
gradleApi()
의존성 자동 추가- 플러그인 디스크립터 자동 생성
- 플러그인 마커 아티팩트 설정
plugins {
id 'java-gradle-plugin'
}
gradlePlugin {
plugins {
simplePlugin {
id = 'org.example.greeting'
implementationClass = 'org.example.GreetingPlugin'
}
}
}
3. Gradle 플러그인의 핵심 구성 요소
- Gradle 플러그인은 세 가지 핵심 구성 요소로 이루어집니다:
Plugin<Project>
: 플러그인의 진입점이자 전체 조율자Extension
: 사용자로부터 설정값을 받는 인터페이스Task
: 실제 작업을 수 행하는 실행 단위
- 이들의 관계를 이해하는 것이 플러그인 개발의 핵심입니다.
4. Plugin 구현하기
- Plugin은 전체 플러그인의 설정과 동작을 조율하는 핵심 클래스입니다.
- Plugin 인터페이스를 구현하여 플러그인의 동작을 정의합니다.
public class DocumentationPlugin implements Plugin<Project> {
@Override
public void apply(Project project) {
// 1. Extension 등록
DocumentationExtension extension = project.getExtensions()
.create("documentation", DocumentationExtension.class);
// 2. Extension 값을 사용하여 Task 생성 및 구성
project.getTasks().create("generateDocs", DocumentationTask.class, task -> {
task.setOutputDir(extension.getOutputDir());
task.setTitle(extension.getTitle());
});
}
}
4.1 플러그인 설정
build.gradle에서 플러그인을 등록합니다:
plugins {
id 'java-gradle-plugin' // Gradle 플러그인 개발을 위한 플러그인
}
gradlePlugin {
plugins {
documentation {
id = 'com.example.documentation' // 플러그인 식별자
implementationClass = 'com.example.DocumentationPlugin'
}
}
}
5. Extension으로 사용자 설정 받기
- Extension은 사용자가 build.gradle에서 플러그인의 동작을 커스터마이즈할 수 있게 해주는 설정 메커니즘입니다.
- 대부분의 플러그인은 빌드 스크립트에서 설정값을 받아 동작을 조정합니다.
- 이러한 기능은 Extension을 통해 구현됩니다.
5.1 Extension 클래스 정의
- 사용자 설정을 받을 Extension 클래스를 정의합니다
- Extension 클래스는 사용자 설정값을 저장하는 필드와 getter/setter 메서드로 구성됩니다.
- 사용자 설정값은 Extension 객체를 통해 Task로 전달됩니다.
예시
public class DocumentationExtension {
private String outputDir;
private String title;
// getter와 setter
public String getOutputDir() { return outputDir; }
public void setOutputDir(String outputDir) { this.outputDir = outputDir; }
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
}