그레이들 프로젝트 빌드 과정
기본적으로 그레이들 프로젝트를 빌드하기 위해서는 gradle build(또는 ./gradlew build) 명령어를 수행하면 된다.
build라는 태스크를 통해 그레이들 프로젝트의 소스 코드를 컴파일하고, 테스트하고, 빌드까지 완료할 수 있다.
build 태스크를 완료하는 데 총 3가지의 동작 과정이 존재한다.
- Initialization
- Configuration
- Execution
1. Initialization
settings.gradle 스크립트를 통해 프로젝트의 정보를 수집하는 단계이다.
(그레이들 버전이 5.0 이상인 경우 스크립트의 언어가 코틀린이므로 settings.gradle 대신 settings.gradle.kts 존재)
그레이들은 settings.gradle 스크립트의 내용을 실행하여 해당 프로젝트가 싱글 모듈인지, 아니라면 어느 서브 프로젝트를 포함하는지를 알 수 있다.
아래는 settings.gradle 내용 작성 예시이다.
내용과 주석을 보면 알 수 있듯, 루트 프로젝트의 이름은 project이고 내부에 서브 프로젝트 2개(sub-project-a, sub-project-b)가 존재한다.
// settings.gradle(.kts) 내용 작성 예시
/*
루트 프로젝트의 이름을 정의하는 부분
init 태스크를 실행했다면 아래의 내용이 자동으로 생성됨
*/
rootProject.name = 'project'
/*
그레이들 프로젝트가 여러 개의 서브 프로젝트로 이루어져 있다면
include 구문을 추가해야 함
*/
include('sub-project-a')
include('sub-project-b')
추가로 설명하자면, 그레이들은 settings.gradle 스크립트를 실행하면서 Settings 객체를 생성하고 각 모듈마다 Project 객체를 생성한다.
서브 프로젝트가 없다면 루트 프로젝트에 대한 Project 객체가 생성된다.
스크립트 파일
settings.gradle에 대해 더 알아보고 싶어 그레이들의 스크립트 파일에 대해 정리해 보았다.
그레이들의 스크립트 파일은 그레이들 API를 호출하는 방식으로 이루어져 있다.
스크립트 파일을 실행함으로써 파일과 대응되는 객체에 대한 메소드를 호출하여 객체를 설정한다.
즉, settings.gradle의 include('sub-project-a')를 실행할 때, 스크립트에 대응하는 Settings 객체의 include('sub-project-a')를 실행하는 것이다.
클로저(람다)
build.gradle에는 아래와 같이 중괄호 블록으로 이루어진 문법이 등장한다.
// 예시 - build.gradle 일부
repositories {
mavenCentral()
}
예시에 있는 repositories는 Project 객체의 메소드인데, 위와 같이 메소드에서 인자로 받아들여지는 익명의 함수를 그루비에서는 클로저, 코틀린에서는 람다라고 한다.
그렇다면 Project.repositories를 실행할 때 mavenCentral()을 실행하는 코드가 인자로 전달되는 것은(클로저) 확인했지만, mavenCentral()은 어디서 나온 메소드일까?
delegate
클로저(람다)에는 delegate라는 문법이 존재하여, 클로저의 내부 객체와 연결하고자 하는 외부 객체를 명시적으로 연결할 수 있다.
delegate를 통해 클로저와 객체가 연결되면, 클로저 안의 객체가 밖의 객체인 것처럼 동작한다.
settings.gradle, build.gradle의 내용을 실행하기 전부터, 그레이들은 클로저와 객체가 이미 연결된 상태로 존재한다.
그레이들 공식 문서에 의하면 repositories 메소드는 프로젝트에 대한 RepositoryHandler 객체와 delegate로 연결되어 있다고 한다.
즉, 예시의 코드는 repositories 메소드의 인자로 RepositoryHandler 객체의 mavenCentral() 메소드를 실행하는 클로저를 전달한 것과 같다.
2. Configuration
Initialization 단계 이후, 그레이들은 모듈마다 정의된 build.gradle 스크립트의 내용을 실행한다.
이 과정에서 그레이들은 스크립트에 정의된 태스크 정보와 속성을 프로젝트에 반영하고, 요청된 태스크(해당 글의 시점에서는 build)에 대한 태스크 실행 순서 그래프(의존 그래프)를 생성한다.
그레이들의 태스크는 실행 순서를 정의할 수 있으며, 태스크의 실행 순서에 따라 의존 관계가 정해지기 때문에 의존 순서를 그래프로 저장하는 것이다.
build.gradle에 대한 내용은 다음 게시글에서 정리해보고자 한다.
3. Execution
그레이들이 태스크를 실행하는 단계이다.
그레이들은 앞에서 저장한 의존 그래프 내용을 통해, 먼저 수행되어야만 하는 태스크를 실행한 뒤 우리가 지정한 태스크를 수행한다.
클로저 정보 출처
https://blog.majecty.com/posts/2021-08-22-a-understanding-gradle-3.html
'백엔드 공부 메모 > Gradle' 카테고리의 다른 글
[참고] 왜 build.gradle의 dependencies 블록에서 Configuration을 메소드처럼 사용할 수 있을까? (0) | 2024.03.18 |
---|---|
build.gradle 스크립트 (2) | 2024.03.18 |
그레이들(Gradle) 소개 (0) | 2024.03.17 |