사용자는 build.gradle, settings.gradle, init.gradle ... 과 같은 그레이들 스크립트를 작성한다. 사용자가 작성한 스크립트 안에는 빌드 과정에서 실행되어야 할 동작이 기술되어 있다.

 

그레이들은 미리 정해진 단계(lifecycle phases)에 따라 빌드를 수행하는데, 각 단계에 맞는 스크립트를 읽어들이고, 각 파일의 성격에 해당하는 그루비 인스턴스를 생성한다. 이 인스턴스는 사용자가 스크립트에 작성한 내용을 알고 있어, 이 내용에 해당하는 메서드를 실행한다.

 

Lifecycle Phases

그레이들의 빌드 라이프싸이클에는 다음 단계가 존재한다.

1. Initialization

그레이들 자체의 설정, 전역 프로퍼티 설정 등 현재 빌드 대상 프로젝트에 종속되지는 않지만 공통으로 적용되어야 할 동작을 초기화한다. 그레이들이 빌드할 대상 프로젝트가 이 시점에 결정된다.

 

구체적인 동작은, .gradle/init/ 경로의 init.gradle + *.gradle 파일을 읽어들여 Gradle 인스턴스를 생성한다. 그리고 프로젝트의 settings.gradle 파일로 Settings 인스턴스를 생성한다. 그레이들이 빌드할 대상 프로젝트가 결정되면 build.gradle 을 참조하여 각 프로젝트의 Project 인스턴스를 생성하여 빌드 수행을 준비한다.

 

2. Configuration

현재 빌드 대상 프로젝트를 위한 설정을 적용한다. build.gradle 파일을 바탕으로, Initialization 단계에서 생성된 Project 인스턴스들에 빌드 설정을 적용한다. build.gradle 파일이 이 단계에서 실행되어 Task, Action 인스턴스들을 생성하고, Task들이 실행될 순서 등을 정리한다. (calculating task graph)

 

3. Execution

Configuration 단계에서 준비된 내용을 바탕으로 실제 Task의 Actions를 실행한다.

 

 

Interfaces

그레이들에는 6가지 메인 인터페이스가 존재한다. (설명에는 '인스턴스' 라 칭했는데, 실제 생성된 실체는 인스턴스는 인터페이스를 구현한 객체의 인스턴스이기 때문이다.)

1. Script

그레이들은 사용자가 작성한 *.gradle 을 읽어들여 Script 인스턴스를 생성한다. 이 인스턴스는 빌드 스크립트를 실행하는 기반이 된다.

 

2. Gradle

그레이들은 .gradle/init 경로의 init.gradle + *.gradle 파일로 Gradle 인스턴스를 생성한다. 그레이들 설정, 전역 프로퍼티 설정 등 프로젝트에 종속되지 않는, 그레이들의 글로벌한 영역을 담당한다.

 

3. Settings

그레이들은 프로젝트의 settings.gradle 파일로 Settings 인스턴스를 생성한다. settings.gradle은 싱글 프로젝트 빌드에서는 옵셔널이지만, 멀티 프로젝트 빌드에서는 필수이다. 즉 여러 프로젝트 간의 관계 구성 정보를 담고 있고, Settings 인스턴스는 이 영역을 담당한다.

 

4. Project

그레이들은 프로젝트의 build.gradle 파일로 Project 인스턴스를 생성한다. build.gradle 파일이 한 프로젝트를 위한 빌드 스크립트이듯, Project 인스턴스는 그 프로젝트의 빌드 과정에 실행되어야 할 Tasks 인스턴스들을 참조하고 있다. Project 인스턴스는 Task 인스턴스들의 컬렉션이라고도 말할 수 있다.

 

5. Task

build.gradle 파일에 선언된 하나의 task 는 하나의 Task 인스턴스가 된다. Task 인스턴스는 자신이 선언된 Project 인스턴스에 종속된다. 하나의 Task 인스턴스는 java 파일 컴파일, java doc 생성과 같이, 빌드 과정 중 수행되어야 할 하나의 아토믹한 과정을 의미한다. 하나의 Task는 자신이 실행할 Action 인스턴스들을 참조하고 있다. Project 인스턴스가 Task 인스턴스들의 컬렉션이듯, Task 인스턴스는 Action 인스턴스들의 컬렉션이라고 할 수 있다.

 

6. Action

build.gradle 파일로 생성된 Task 인스턴스가 실제 실행할 동작을 의미하는 인스턴스이다. Action 인스턴스는 자신이 선언된 Task 인스턴스에 종속된다.

 

 

Lifecycle Phases / 생성 Interfaces / Script Files 매핑

Initialization / Gradle, Settings, Project / init.gradle + *.gradle, settings.gradle, build.gradle

Configuration / Task, Action / build.gradle

Execution / - / build.gradle

※ Script 인스턴스는 각 gradle 파일을 읽는 단계에서 생성.

 

 

기술적 작동 원리

그레이들은 각 gradle 파일에 해당하는 Script 인스턴스를 생성한다. init.gradle 파일은 이에 해당하는 Script 인스턴스가, build.gradle 파일은 이에 해당하는 Script 인스턴스가 독립적으로 생성된다.

 

이 Script 인스턴스는 빌드 phase에 매핑되는 인스턴스에 delegating하는 방식으로 빌드 과정을 수행한다. 이 delegating은 그루비의 Closure 인스턴스의 delegate = <context> 를 지정하는 방법으로 이루어진다. 이런 방식으로, 그레이들 글로벌 정보를 담은 Gradle 인스턴스에 무언가를 설정하려면 init.gradle 파일에 그 내용을 기술하고, 프로젝트 실제 빌드에 무언가를 설정하려면 build.gradle 파일에 그 내용을 기술하여 그레이들이 delegating을 통해 그 내용을 빌드 과정에서 실행하도록 한다.

 

phases / delegating 대상 인스턴스 / Script Files 매핑

Initiliazation / Gradle, Settings / init.gradle + *.gradle, settings.gradle

Configuration / Project / build.gradle

 

정리하자면, 하나의 *.gradle 파일은 인스턴스가 된다. 그리고 이 인스턴스는 빌드 과정 중 자신에게 해당하는 단계에 delegating되어 실행된다. 즉 *.gradle 파일을 작성함은 하나의 Closure code block을 작성하는 것이라 말할 수 있을 것이다.

+ Recent posts