[Gradle] 빌드 스크립트 기본

2023. 3. 18. 22:17Build Tools/Gradle

Hello world

tasks.register('hello') {
    doLast {
        println 'Hello world!'
    }
}

커맨드 라인에서 gradle -q hello를 실행하면 다음과 같은 결과가 나온다.

Hello world!
💡 -q 옵션은 Gradle의 로그 메시지를 숨겨주는 옵션이다.

알 수 있는 것

  • Gradle의 task는 tasks.register(String) { … } 으로 등록한다.
  • task는 gradle [OPTIONS] [TASK_NAME] 으로 실행한다.

Build scripts are code

변수 사용하기

tasks.register('upper') {
    doLast {
        String someString = 'mY_nAmE'
        println "Original: $someString"
        println "Upper case: ${someString.toUpperCase()}"
    }
}

gradle -q upper의 실행 결과

Original: mY_nAmE
Upper case: MY_NAME

메서드 사용하기

tasks.register('1to5') {
    doLast {
        loop()
    }
}

void loop() {
    5.times { print "${it + 1}" }
}

반복하기

tasks.register('count') {
    doLast {
        4.times { print "$it " }
    }
}

gradle -q count의 실행 결과

0 1 2 3

Task dependencies

기본 dependsOn

tasks.register('hello') {
    doLast {
        println 'Hello world!'
    }
}

tasks.register('intro') {
    dependsOn tasks.hello
    doLast {
        println "I'm Gradle"
    }
}

gradle -q intro의 실행 결과

Hello world!
I'm Gradle

지연 dependsOn

tasks.register('taskX') {
    dependsOn 'taskY'
    doLast {
        println 'taskX'
    }
}

tasks.register('taskY') {
    doLast {
        println 'taskY'
    }
}

gradle -q taskX의 실행 결과

taskY
taskX
  • task가 실행 중 dependsOn에 의해 의존하는 다른 task를 만나는 경우 현재 task의 작업은 미뤄진다.

Flexible task registration

  • 반복문을 통해서 여러 개의 task를 등록할 수도 있다.
4.times { counter ->
    tasks.register("task$counter") {
        doLast {
            println "I'm task number $counter"
        }
    }
}

gradle -q task1의 실행 결과

I'm task number 1

Manipulating existing tasks

  • task들이 등록됐을 때 API를 통해 task에 접근할 수 있다. 예를 들어 런타임에 동적으로 의존성을 task에 추가할 수도 있다.
4.times { counter ->
    tasks.register("task$counter") {
        doLast {
            println "I'm task number $counter"
        }
    }
}
tasks.named('task0') { dependsOn('task2', 'task3') }

gradle -q task0의 실행 결과

I'm task number 2
I'm task number 3
I'm task number 0

Action 추가하기

tasks.register('hello') {
    doLast {
        println 'Hello Earth'
    }
}
tasks.named('hello') {
    doFirst {
        println 'Hello Venus'
    }
}
tasks.named('hello') {
    doLast {
        println 'Hello Mars'
    }
}
tasks.named('hello') {
    doLast {
        println 'Hello Jupiter'
    }
}

gradle -q hello의 실행 결과

Hello Venus
Hello Earth
Hello Mars
Hello Jupiter
  • 위와 같이 액션을 추가하면 이는 task의 액션 리스트에 추가된다. 액션을 추가하는 경우 순서대로 실행된다.

Default Tasks

defaultTasks 'clean', 'run'

tasks.register('clean') {
    doLast {
        println 'Default Cleaning!'
    }
}

tasks.register('run') {
    doLast {
        println 'Default Running!'
    }
}

tasks.register('other') {
    doLast {
        println "I'm not a default task!"
    }
}

gradle -q의 실행 결과

Default Cleaning!
Default Running!
  • 위의 gradle -qgradle -q clean run과 같다.

External dependencies for the build script

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath group: 'commons-codec', name: 'commons-codec', version: '1,2'
    }
}

buildscript() 메서드는 ScriptHandler 인스턴스가 구성한다. classpath 구성에 의존성을 추가함으로써 빌드 스크립트 클래스패스에 정의할 수 있다.

빌드 스크립트 경로를 선언하면 클래스 경로의 다른 클래스와 마찬가지로 빌드 스크립트의 클래스를 사용할 수 있다.

import org.apache.commons.codec.binary.Base64

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath group: 'commons-codec', name: 'commons-codec', version: '1.2'
    }
}

tasks.register('encode') {
    doLast {
        def byte[] encodedString = new Base64().encode('hello world\n'.getBytes())
        println new String(encodedString)
    }
}

gradle -q encode의 실행 결과

aGVsbG8gd29ybGQK