gradle task type - 01

 

Task

gradle을 통해 단일의 작업을 의미한다. clean, compileJava, build 등 기본적으로 정의된 작업 뿐만 아니라 사용자가 원하는 작업을 정의할 수 있다.

기본 구조

task myTask

task myTask { 
	//...
}

task myTask(type: someType)

task myTask(type: SomeType) { 
	//...
}

Type

공통

dependsOn : task의 종속성을 설정할 수 있다. dependsOn ${TASK} 가 먼저 실행 된다. 여러개의 dependsOn이 한 task에 존재한다면 그 순서는 보장되지 않는다. 순서에 보장된 task를 실행하기 위해서는 mustAfterRun 을 통해서 정의한다.

task a {
    doFirst {
        println "A"
    }
}

// dependsOn #1
task b {
    dependsOn a
    doFirst {
        println "B"
    }
}

// dependsOn #2
task c (dependsOn: 'b') {
    doFirst {
        println "C"
    }
}

task d {
    doFirst {
        println "D"
    }
}

// dependsOn #3
task e (dependsOn: ['c', 'd']) {
    doFirst {
        println "E"
    }
}

/*

Executing task 'e'...

> Task :a UP-TO-DATE
> Task :b UP-TO-DATE
> Task :c UP-TO-DATE
> Task :d UP-TO-DATE
> Task :e UP-TO-DATE

*/

doFirst : 해당 action을 Task 목록 시작 시 수행한다.

doLast : 해당 action을 Task 목록 끝에 수행한다.

finalizedBy : Task 목록의 종료 전 수행한다.

task greet {
    println "TASK [greet]"

    doFirst {
        println "greet #1"
    }
    doLast {
        println "greet #2"
    }
    finalizedBy {
        println "greet END"
    }
}

task close {
    dependsOn greet
    println "TASK [close]"

    doFirst {
        println "close #1"
    }
    doLast {
        println "close #2"
    }
    finalizedBy {
        println "close END"
    }
}

/*

Executing task 'close'...

> Configure project :
TASK [greet]
TASK [close]
close END
greet END

> Task :greet
greet #1
greet #2

> Task :close
close #1
close #2

*/

property : 해당 Task에 속성 값을 반환한다.

setProperty : 해당 Task에 속성을 설정한다

hasProperty : 해당 Task에 속성이 있는지 확인한다.

task initTimeout {
    println "before: ${property("timeout")}"

    setProperty("timeout", Duration.ofSeconds(10L))
    println "after: ${property("timeout")}"
}

/*

Executing task 'initTimeout'...

> Configure project :
before: property(java.time.Duration, undefined)
after: property(java.time.Duration, fixed(class java.time.Duration, PT10S))

*/

onlyIf : True일 경우에만 실행한다. 하나라도 false인 경우 skip한다.

task sayHelloWhenOsSystemIsWindows (type: Exec) {
    onlyIf {
        org.gradle.internal.os.OperatingSystem.current().isWindows()
    }
    doFirst {
        commandLine 'cmd', '/c', 'echo', 'Hello'
    }
}

mustRunAfter : 여러개의 태스크를 수행할 때 특정 Task 이후 실행해야 할 Task를 설정한다.

task a {}

task b {}

task c {
    dependsOn a, b

    a.mustRunAfter b
}

/*

Executing task 'cc'...

> Task :bb UP-TO-DATE
> Task :aa UP-TO-DATE
> Task :cc UP-TO-DATE

*/

Execute

명령을 실행 할 수 있는 Task 타입이다

commandLine : command 명령을 수행할 수 있다.

task buildAppImage(type: Exec) {
	commandLine 'appimage-builder', '--recipe', 'build/appimage-builder.yml'
}

Copy

파일이나 디렉토리를 복사 할 수 있는 Task 타입이다

from : 복사하려는 대상 (source)을 설정한다. include, exclude, rename등을 활용하여 복사를 할 수 있다.

into : 복사본의 디렉토리

task copyAppImageBuilder(type: Copy) {
	dependsOn bootJar
	
	from file("src/main/resources/appimage-builder.yml")
	into "build"
}

task copyAssets(type: Copy) {
	from('src/main/resources/assets') {
	  include '**/*.png'
	  include '**/*.so'
	
	  exclude '**/*.xml'
	
	  rename '([0-9]+)\\([a-zA-Z]+)', '$1_$2'
	}

	into "build/assets"
}

Jar

Jar파일로 산출물을 만든다

manifest : Jar파일로 만들기 위한 설정을 할 수 있다.

entryCompression : Jar 파일의 압축 수준을 정할 수 있으며 기본값은 ZipEntryCompression.DEFLATED 이며, ZipEntryCompression.STORED 인 경우 압축하지 않는다.

jar {
    manifest {
        attributes 'Main-Class': 'lab.yearnlune.task.MainEntry'}
    entryCompression ZipEntryCompression.DEFLATED
    from { (configurations.runtimeClasspath).collect { it.isDirectory() ? it : zipTree(it) } } {
        exclude 'META-INF/.RSA', 'META-INF/.SF', 'META-INF/*.DSA', 'META-INF/*.SF'
        exclude 'org/slf4j/**'
    }
    archiveFileName.set("task.jar")
}

참고문헌

Gradle 7.2

Leave a comment