Gradle이 동작하는 순서
Gradle은 Initialization, Configuration, Execution 세가지 Step을 통해 작업을 수행한다.
💡 Gradle이 동작하는 순서
1. Initialization
2. Configuration
3. Execution
Initialization
Initialization step에서는 gradle은 settings.gradle.kts를 읽어 프로젝트 이름이 무엇인지, 프로젝트에는 어떤 모듈들이 있는지를 확인한다. 멀티 모듈 프로젝트 일 때는 각 모듈 별로 build.gradle.kts 파일이 있는지 이 단계에서 확인한다.
예를 들어 settings.gradle.kts가 다음과 같을 때를 살펴보자.
rootProject.name = "KotlinProject"
include("app")
include("app-repository")
이때 Initialization 단계에서는 프로젝트의 이름이 KotlinProject라는 것을 확인하고, 모듈은 app과 app-repository란 것을 확인한 후 각 모듈 폴더 안에 build.gradle.kts가 있는지 확인한다.
Configuration
Gradle 작업을 하기 위해 필요한 Gradle Task를 순차적으로 수행한다. 보통 라이브러리를 가져오는 작업이나, 프로젝트를 Configure하는 작업들이 이 단계에서 수행된다. 예를들어 build.gradle의 dependency block에서 library들을 가져오는 작업들이 이 단계에서 수행된다.
Configuration 단계의 작업은 > Configure project :[모듈명]으로 뜬다. 만약 app 모듈이라면 화면에는 다음과 같이 뜬다.
> Configure project :app
Task on Configuration
Execution
Compile 을 하거나 Test를 하거나 패키징하는 작업(jar, war, aab, apk)을 Execution 단계에서 한다. Annotation Processing을 통한 Code gen 작업, Kotlin이나 Java 파일을 바이트 코드로 변환하는 작업(Compile), 변환된 바이트 코드를 사용해 테스트하거나 패키징을 하는 작업등이 모두 이 단계에서 수행된다.
[그림1]의 > Task가 붙어서 나오는 task 들이 바로 Execution 작업이다. 아래에 보면 compile 작업과 리소스를 가져오는 작업들이 이 단계에서 수행되는 것을 확인할 수 있다.
> Task :app:compileKotlin UP-TO-DATE
> Task :app:compileJava NO-SOURCE
> Task :app:processResources NO-SOURCE
> Task :app:classes UP-TO-DATE
Gradle Task는 Configuration 단계와 Execution 단계에서 수행된다.
Gradle Task의 기본 블록은 Configuration 단계에서 수행되지만, doFirst { }, doLast { } 메서드 블록은 Execution 단계에서 수행된다.
예를 들어 아래와 같이 task를 만들어보자.
task("sampleTask"){
println("Task on Configuration")
doFirst {
println("Task on Execution")
}
}
위의 task를 gradle sampleTask 를 이용해 수행하면 다음과 같이 결과가 나온다. Configure project(Configuration 단계)에서 Task on Configuration이 수행되고, Task(Execution 단계)에서 Task on Execution이 수행되는 것을 확인할 수 있다.
$ gradle sampleTask
> Configure project :app
Task on Configuration
> Task :app:sampleTask
Task on Execution