아직 애플리케이션을 제작하는 단계에서 Gradle의 Task를 Custom 하는 일은 없을 것 같지만, 알고 사용하는 게 좋을 것 같아 공부해 보았다.
간단히 말해서 TASK는 "Build 프로세스에 필요한 정의된 하나의 작업"으로 Gradle의 단위라고 볼 수 있다.
Gradle API에 정의된 Task들이 있고, 필요시 우리가 Custom 해서 사용할 수도 있다.
Gradle은 JAVA로 작성된 빌드 자동화 도구로 JVM에서 실행된다
BuildScript는 Gradle의 수행할 작업과 설정을 정의하는 설명서로 코틀린을 사용하면 'build.gradle.kts'로 작성
즉 Gradle은 빌드 스크립트를 해석하고 실행하는 엔진임
1. Task 정의/등록하기
Task 정의는
1. Task 만들기 : 말 그대로 Task 생성
2. Task 등록하기 : 빌드 로직에 추가 가능
순으로 작성하며 Gradle 홈페이지의 예제는 아래와 같다.
abstract class CreateFileTask : DefaultTask() { //Task 생성(정의)
@get:Input
abstract val fileText: Property<String>
@Input
val fileName = "myfile.txt"
@OutputFile
val myFile: File = File(fileName)
@TaskAction
fun action() {
myFile.createNewFile()
myFile.writeText(fileText.get())
}
}
tasks.register<CreateFileTask>("createFileTask") { // Task 등록
group = "custom"
description = "Create myfile.txt in the current directory"
fileText.convention("HELLO FROM THE CREATE FILE TASK METHOD") // Set convention
}
tasks.named<CreateFileTask>("createFileTask") {
fileText.set("HELLO FROM THE NAMED METHOD") // Override with custom message
}
왜 abstract class로 Task를 정의했을까?
이는 Gradle의 Custom Task 정의 패턴으로, 기존에 우리가 아는 방식과 같다.
위의 기준으로는 fileText를 유연하게 재설정할 수 있도록 abstract로 정의했다.
이렇게 정의/등록한 Task를 아래와 같이 CommandLine에서 사용하면 된다.
./gradlew createFileTask
2. Task의 편의성 예
위는 Task를 생성하는 방법을 알아보았고, 이제 왜 Task를 써야 하는지 간단한 Jar파일을 만드는 것을 예로 들어보겠다.
MyClass.java파일을 1) class파일로 컴파일하고 2) JAR로 패키징하고 3) 특정 위치에 생성
cd ~~특정 위치
javac MYClass.java
# class파일로 컴파일
jar cf MyApp.jar MyClass.class
# Jar로 패키징
mkdir c:\wj
copy MyApp.jar c:\wj
MyClass를 수정하고 다시 컴파일 -> 패키징 -> 생성하는 과정을 여러 번 하다 보면 피곤함을 느낄 것임.
근데 이미 정의된 Task와 배포된 'java' plugin을 이식하여 gradle을 작성하면 쉽게 사용할 수 있다.
tasks.jar {
archiveBaseName.set("MyApp")
from(sourceSets.main.get().output)
}
tasks.register<Copy>("deployApp") {
from(tasks.jar.get().archiveFile)
into("C:/deploy")
}
위와 같이 정의된 Copy를 사용하여 Jar을 만들고 필요한 부분에 배포한다.
./gradlew deployApp
한번 만든 'deployApp'을 통해서 간편하게 만든 수 있다.
만약 애플리케이션 개발 중 Custom 해서 해볼 만한 기능은
Build 중 사용하지 않은 Resource를 자동으로 제거해 주는 기능정도지 않을까?..
그 이외의 다른 기능들은 혹시 필요하거나 실제로 사용하는 기회가 있으면 해 보겠다.
4. 참고
정의된 Copy Task
gradle/subprojects/core/src/main/java/org/gradle/api/tasks/Copy.java at master · gradle/gradle
Adaptable, fast automation for all. Contribute to gradle/gradle development by creating an account on GitHub.
github.com
'gradle' 카테고리의 다른 글
4. Plugin Extension이해하기(AGP) (1) | 2024.08.30 |
---|---|
3. Gradle Plugin 알아보기 (0) | 2024.08.22 |
1. Gradle이 무엇이고, 왜 쓰는가? (0) | 2024.08.16 |
3. Android Gradle Plugin Extend해보기 (0) | 2022.10.23 |
2. Gradle의 Plugin (0) | 2022.10.21 |