Gradle은 Maven과 함께 많이 사용되는 빌드툴입니다.
Task를 Custom하여 jar파일 생성 후 해당 파일을 원하는 경로에 복사하는 것까지 진행해보겠습니다.
Task란?
빌드로 수행되는 하나의 독립적인 유닛으로,
compile, jar생성, javadoc생성, publish모두 Task의 일종입니다.
→ build script나, plugin으로부터 Task를 가져올 수 있습니다.
아래는 java라는 플러그인을 호출하면, java와 관련된 task를 활용할 수 있습니다.
plugins {
id 'java'
}
현재 활용 가능한 task는 터미널에서 ./gradlew tasks로 확인할 수 있습니다.
// gradlew파일이 있는 위치에서 ./gradlew tasks
Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
buildDependents - Assembles and tests this project and all projects that depend on it.
buildNeeded - Assembles and tests this project and all projects it depends on.
classes - Assembles main classes.
clean - Deletes the build directory.
jar - Assembles a jar archive containing the classes of the 'main' feature.
testClasses - Assembles test classes.
Build Setup tasks
-----------------
init - Initializes a new Gradle build.
...
Task의 분류
1. Actionable Task : 액션이 있는 task로 compileJava와 같은 task
2. Lifecycle task : 액션이 없는 task로 assemble, build와 같은 task
일반적으로 Lifecycle Task는 Actionable Task에 의존하며, 여러 task를 한 번에 실행하기 위해 사용됩니다.
Tasks.named(태스크명) - 태스크 설정
이미 등록된 Task에 대해 추가로 configuration 설정 등 처리를 접근해야할 때가 있습니다.
그 때, tasks.named("task명")으로 접근해서 설정할 수 있습니다.
tasks.register("developer"){
print("Hello World!") //1. 여기는 바로 실행되는 부분
doLast {
print "good bye" //3. doLast라 마지막에 실행
}
}
tasks.named("developer"){
doFirst {
print "hello developer\n" //2. doFirst라 처음에 실행
}
}
실행결과는 아래와 같습니다. 아래 내용에 대해 더 알고 싶으시면, 다음 링크를 참고하세요~!
(https://docs.gradle.org/current/userguide/build_lifecycle.html)
Hello World!
> Task :developer
hello developer
good bye
Task 등록 및 실행
아래와 같이 등록하면, Intellij의 경우 오른쪽 gradle 도구에서 확인이 가능합니다.
tasks.register("developer"){
print("Hello World!")
}
tasks.register({등록하는 action의 이름}){
// 실행되는 액션
}
실행을 위해서는 developer task를 더블클릭하여 실행하거나, ./gradlew developer 명령어로 실행할 수 있습니다.
Task Dependencies - Task간 의존관계 형성
dependsOn키워드를 활용해 Task간에 의존관계를 형성하는 것도 가능합니다.
tasks.register("developer"){
print("Hello World!\n") // 2. 1에 이어서 실행
doLast {
print "good bye" //6. doLast 때문에 6번째로 실행
}
}
tasks.register("manager"){
doLast{
print "manager : hello" // 7. developer의 doLast이후 처리
}
dependsOn tasks.developer // 1. developer task이후에 manager실행
dependsOn tasks.designer // 3. designer task이후 manager 실행
print("Hello Team!\n") // 5. 읽히면서 바로 실행됩니다.
}
tasks.register("designer"){
print("Hello Design!\n") // 4.designer task가 실행되면서 실행
}
아래 실행 결과를 보면서 대략적인 감을 잡으실 수 있습니다.
// 실행 결과
Hello World!
Hello Design!
Hello Team!
> Task :designer UP-TO-DATE
> Task :developer
good bye
> Task :manager
manager : hello
jar 생성 및 Copy Task : Custom Task
gradle의 task는 모두 Task의 하위 클래스로, task를 extends해서 customTask를 만들 수 있습니다.
built in task Type에는 Copy, GroovyDoc, Zip, Jar, JacocoReport, Sign, or Delete등이 있으며, 여기서는 Copy를 활용하겠습니다.
tasks.register("jarAndCopy",Copy) { //task명 : jarAndCopy
from jar // jar task를 실행하여 생성한 파일(jar)을
into "C:/DP/" // 아래 경로에 복사합니다.
}
tasks.register("copyTask",Copy) {
from("source") // source 디렉터리에 있는 파일을
into("target") // target 디렉터리로 옮깁니다.
include("*.war") // 옮기는 파일은 .war파일입니다.
}
하위 모듈의 개수가 늘어나고, 관련 jar을 여러 플랫폼에서 사용한다면, copy를 활용하는 것도 좋은 방법이 될 수 있습니다.
도움이 되셨길 바랍니다.
참고
Gradle Docs
https://docs.gradle.org/current/userguide/tutorial_using_tasks.html
'Gradle' 카테고리의 다른 글
[Gradle] Gradle - Build LifeCycle/ build script의 실행 순서에 대한 이해! (0) | 2024.02.01 |
---|
댓글