Task란?
Gradle에서 Task는 많은 기능들을 합니다. 파일을 생성 한다던지.. 복사를 한다던지.. 압축등 빌드 타임에 많은 일들을 할수 있죠!
자바를 개발하며 gradle build를 하면 build 디렉터리가 생성되고 클래스파일이 생성되는 등..이 Gradle에서 구현해놓은 Task들이 해주는 작업들이에요. 이러한 Task를 내가 원하는 기능을 구현하도록 커스텀 태스크를 만드는 방법을 적어보려 합니다.
커스텀 Task 생성 방법
커스텀 태스크 생성에는 몇가지 방법이 있습니다.
- Gradle 빌드 스크립트에서 구현하기 (.gradle 혹은 .gradle.kts 파일) 내에서 즉시 구현 (동적 구현)
- 커스텀 클래스를 생성하여 자바 혹은 코틀린 (혹은 그루비..!?) 로 구현
1. Gradle 빌드 스크립트에서 구현하기
빌드 스크립트에서 동적으로 구현하는 방법을 알아봅시다! 방법은 아래와 같이 빌드스크립트 내에서 바로 구현해요.
tasks.register("userNamePrintTask") {
group = "custom"
description = "this is userNamePrintTask"
doFirst {
println("userNamePrintTask start!")
}
inputs.property("userName", "honeybug")
doLast {
println("my name is ${inputs.properties["userName"]}")
}
}
tasks.register를 하면 org.gradle.api.DefaultTask 클래스에 해당하는 task가 등록된다고 해요.
위와 같이 task를 만들면
group 속성에 의해 custom이라는 폴더가 보여지게 되고, register하면서 지정한 이름인 userNamePrintTask가 보여지게 되네요!
또한 마우스 오버 시에 description 까지 확인 되는 것을 볼 수가 있습니다.
해당 태스크를 실행하면 위와 같이 정의한 task가 실행되게 되요!
2. 커스텀 클래스를 구현하는 방법
클래스를 직접 구현하여 사용하는 방법도 있어요. 구현 클래스는 프로젝트의 root/buildSrc/src/main~~에 있어야 한다고 하네요!
클래스의 구현은 아래와 같이 진행 했어요.
public abstract class UserNamePrintTask extends DefaultTask {
private String userName;
@Input
public String getUserName() {
return this.userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@TaskAction
public void perform() {
System.out.println("my name is " + userName + " by class");
}
}
저는 자바개발자라.. 자바가 익숙하여 자바로 했는데요! Task 클래스는 코틀린으로 하는게 훨씬 간결해보이고 좋아보이긴 하더라구요..
구현체를 보면, @Input 어노테이션의 경우 tasks.register 시 받을 파라미터에 달아주도록 해요. 그리고 @TaskAction 어노테이션이 달린 메소드가 실제로 해당 Task가 실행될 때 실행되는 코드에요. 위의 빌드스크립트에서 구현한 것과 별반 다를게 없어요.
추가적으로 공식문서에서 @Input을 Getter메소드에 달아주는게 좋다고 하네요..? 뭔가 어색한 것 같긴 해요. 코틀린으로 하면 훨씬 자연스럽게 코드가 나오더라구요! 또한 클래스를 추상클래스로 선언하는 것을 추천한다고 하네요. 정확하진 않지만 추상 클래스로 선언하고, 그래들 스크립트 내에서 tasks.register 하면서 그래들이 해당 추상클래스를 상속받으면서 설정한 파라미터들을 갖는 구현체를 내부적으로 갖는게 아닐까 생각해요! 추측입니다..!
import com.honeybug.UserNamePrintTask
tasks.register<UserNamePrintTask>("userNamePrintTaskByClass") {
group = "custom"
description = "this is userNamePrintTask by class"
doFirst {
println("userNamePrintTask start!")
}
userName = "honeybug"
}
빌드 스크립트에서 register를 해줘요. UserNamePrintTask 클래스를 타입파라미터로 넘김으로써, 해당 클래스를 이용한 task가 생성이 돼요. 위와같이 register를 하면 스크립트를 이제 실행할 수 있어요.
이렇게 해서 아주 아주 아주 간단한 커스텀 태스크를 만들어 보았어요. 이 부분을 시작점으로 점차 나아가며 플러그인까지 만들어 볼 수 있을 것 같아요!
참고: https://docs.gradle.org/current/userguide/more_about_tasks.html
'GRADLE' 카테고리의 다른 글
Gradle에서 각 Task 간에 순서대로 실행하기 (2) | 2024.10.03 |
---|